this
在JavaScript中,解析器在调用函数时每次都会传入一个隐含参数this
this 指向函数执行的上下文对象;函数调用方式不用,this会指向不同上下文对象。也就是说谁调用this,this指向谁!this指向调用它的对象!
**
构造函数中 this
在构造函数中,new关键字可以改变this指向,this指向构造函数的实例
function Fn(){
this.name = "追梦子";
}
var a = new Fn();
console.log(a.name); //追梦子
构造函数
function Person (name, age) {
this.name = name;
this.age = age;
}
// 自定义一个 New 方法
function New () {
let obj = new Object();
let fn = [].shift.call(arguments); //获取构造函数本身
let args = arguments; // 剩余参数
var ret = fn.apply(obj, args);
obj.__proto__ = fn.prototype;
return typeof ret === 'object' ? ret : obj;
}
let person1 = New(Person, 'Bob', 23);
// shift删除数组第一个元素,并返回该元素
// arguments对象是所有非箭头函数中可用的局部变量
// call,apply,bind 可改变函数体内部this指向
new 关键字实现过程
- 创建一个空对象obj
- 拿到构造函数的第一个参数(第一个参数就是构造函数本身)
- 让构造函数的this指向obj,并执行构造函数
- 设置原型链,将obj的proto成员指向构造函数对象的prototype成员对象
- 返回新对象obj
箭头函数
箭头函数表达式的语法比函数表达式更简洁,并且没有自己的this
,arguments
,super
或new.target
。箭头函数表达式更适用于那些本来需要匿名函数的地方,并且它不能用作构造函数。
没有单独的this
在箭头函数出现之前,每一个新函数根据他是被如何调用来定义这个函数的this值:
- 如果是该函数是一个构造函数,this指针指向一个新的对象
- 在严格模式下的函数调用下,this指向undefined
- 如果是该函数是一个对象的方法,则它的this指针指向这个对象
箭头函数不会创建自己的this,它只会从自己的作用域链的上一层继承this。因此,在下面的代码中,传递给setInterval的函数内的this与封闭函数中的this值相同:
function Person(){
this.age = 0;
setInterval(() => {
this.age++; // |this| 正确地指向 p 实例
}, 1000);
}
var p = new Person();
由于 箭头函数没有自己的this指针,通过 call() 或 apply() 方法调用一个函数时,只能传递参数(不能绑定this),他们的第一个参数会被忽略。(这种现象对于bind方法同样成立)