this

在JavaScript中,解析器在调用函数时每次都会传入一个隐含参数this
this 指向函数执行的上下文对象;函数调用方式不用,this会指向不同上下文对象。也就是说谁调用this,this指向谁!this指向调用它的对象!
**

构造函数中 this

在构造函数中,new关键字可以改变this指向,this指向构造函数的实例

  1. function Fn(){
  2. this.name = "追梦子";
  3. }
  4. var a = new Fn();
  5. console.log(a.name); //追梦子

构造函数

  1. function Person (name, age) {
  2. this.name = name;
  3. this.age = age;
  4. }
  5. // 自定义一个 New 方法
  6. function New () {
  7. let obj = new Object();
  8. let fn = [].shift.call(arguments); //获取构造函数本身
  9. let args = arguments; // 剩余参数
  10. var ret = fn.apply(obj, args);
  11. obj.__proto__ = fn.prototype;
  12. return typeof ret === 'object' ? ret : obj;
  13. }
  14. let person1 = New(Person, 'Bob', 23);
  15. // shift删除数组第一个元素,并返回该元素
  16. // arguments对象是所有非箭头函数中可用的局部变量
  17. // call,apply,bind 可改变函数体内部this指向

new 关键字实现过程

  • 创建一个空对象obj
  • 拿到构造函数的第一个参数(第一个参数就是构造函数本身)
  • 让构造函数的this指向obj,并执行构造函数
  • 设置原型链,将obj的proto成员指向构造函数对象的prototype成员对象
  • 返回新对象obj

箭头函数

箭头函数表达式的语法比函数表达式更简洁,并且没有自己的thisargumentssupernew.target。箭头函数表达式更适用于那些本来需要匿名函数的地方,并且它不能用作构造函数。

没有单独的this

在箭头函数出现之前,每一个新函数根据他是被如何调用来定义这个函数的this值:

  • 如果是该函数是一个构造函数,this指针指向一个新的对象
  • 在严格模式下的函数调用下,this指向undefined
  • 如果是该函数是一个对象的方法,则它的this指针指向这个对象

箭头函数不会创建自己的this它只会从自己的作用域链的上一层继承this。因此,在下面的代码中,传递给setInterval的函数内的this与封闭函数中的this值相同:

  1. function Person(){
  2. this.age = 0;
  3. setInterval(() => {
  4. this.age++; // |this| 正确地指向 p 实例
  5. }, 1000);
  6. }
  7. var p = new Person();

由于 箭头函数没有自己的this指针,通过 call() 或 apply() 方法调用一个函数时,只能传递参数(不能绑定this),他们的第一个参数会被忽略。(这种现象对于bind方法同样成立)