this
在方法內(nèi)部的函數(shù)中使用this
'use strict';
var xiaoming = {
name: '小明',
birth: 1990,
age: function () {
function getAgeFromBirth() {
var y = new Date().getFullYear();
return y - this.birth;
}
return getAgeFromBirth(); // 非嚴(yán)格模式下,在這里函數(shù)執(zhí)行的時(shí)候可以看作是window.getAgeFromBirth(),所以this指向了window
}
};
xiaoming.age(); // Uncaught TypeError: Cannot read property 'birth' of undefined
由于this指針只在age方法的函數(shù)內(nèi)指向xiaoming,在函數(shù)內(nèi)部定義的函數(shù),this又指向undefined了?。ㄔ诜莝trict模式下,它重新指向全局對(duì)象window?。?/p>
修復(fù)的方法可以聲明一個(gè)that變量來捕獲this:
var xiaoming = {
name: '小明',
birth: 1990,
age: function () {
var that = this; // 在方法內(nèi)部一開始就捕獲this
function getAgeFromBirth() {
var y = new Date().getFullYear();
return y - that.birth; // 用that而不是this
}
return getAgeFromBirth();
}
};
xiaoming.age(); // 25
也可以使用箭頭函數(shù):
var obj = {
birth: 1990,
getAge: function () {
var b = this.birth; // 1990
var fn = () => new Date().getFullYear() - this.birth; // this指向obj對(duì)象
return fn();
}
};
obj.getAge(); // 25
由于
this在箭頭函數(shù)中已經(jīng)按照詞法作用域綁定了,所以,用call()或者apply()調(diào)用箭頭函數(shù)時(shí),無法對(duì)this進(jìn)行綁定,即傳入的第一個(gè)參數(shù)被忽略:var obj = { birth: 1990, getAge: function (year) { var b = this.birth; // 1990 var fn = (y) => y - this.birth; // this.birth仍是1990 return fn.call({birth:2000}, year); } }; obj.getAge(2015); // 25
注意在對(duì)象中使用箭頭函數(shù)定義屬性時(shí),this的指向,例如:
let a = 10;
let obj = {
a: 2,
func: () => console.log(this.a) // 或者console.log(a) 調(diào)用結(jié)果都是指向全局的 a
}
由于箭頭函數(shù)沒有執(zhí)行主體,函數(shù)體內(nèi)的this指向只和上下文相關(guān)。所以要this指向?qū)ο缶筒灰褂眉^函數(shù)定義屬性方法:
let obj = {
a: 2,
func: function(){
console.log(this.a); // 2
}
}