var person2 = { name: 'Abby', sayName: person1.sayName }
person2.sayName(); //Abby 作为 person2 的属性方法被调用
但是当在在对象方法中再定义函数,这时候 this 又是 window 。
1 2 3 4 5 6 7 8 9 10 11 12 13
var name = 'Jane'; var person = { name: 'Abby', sayName: function () { functionfn(){ console.log(this); //window console.log(this.name); //Jane } fn(); } }
person.sayName();
如果想让 this 指向 person 的话,只需要用 that 保存下来 this 的值即可,也可以使用 apply 等改变 this。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
var name = 'Jane'; var person = { name: 'Abby', sayName: function () { var that = this; functionfn(){ console.log(that); //Object {name: "Abby"} console.log(that.name); //Abby } fn(); } }
var name = 'Jane'; functionPerson(){ this.name = 'Abby'; } Person.prototype.sayName = function () { console.log(this); // Person {name: "Abby"} console.log(this.name); // Abby } var person = new Person(); person.sayName();
在 Person.prototype.sayName 函数中,this 指向的 person 对象。即便是在整个原型链中,this 也代表当前对象的值。
Eval函数 在 Eval 中,this 指向当前作用域的对象。
1 2 3 4 5 6 7 8 9 10 11
var name = 'Jane'; var person = { name: 'Abby', getName: function(){ eval("console.log(this.name)"); } } person.getName(); //Abby
var getNameWin=person.getName; getNameWin(); //Jane
在这里,和不使用 Eval ,作为对象的方法调用的时候得出的结果是一样的。
箭头函数
箭头函数里面 this 始终指向外部对象,因为箭头函数没有 this,因此它自身不能进行new实例化,同时也不能使用 call, apply, bind 等方法来改变 this 的指向。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
var person = { name: 'Abby', sayName: function() { var fn = () => { return() => { console.log(this); //Object {name: "Abby"} console.log(this.name); //Abby } } fn()(); } }