this

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
}
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 函數(shù) 1.JavaScript允許傳入任意個(gè)參數(shù)而不影響調(diào)用,因此傳入的參數(shù)比定義的參數(shù)多也沒有問題,雖然函數(shù)內(nèi)部...
    wyude閱讀 217評(píng)論 0 1
  • 函數(shù)就是最基本的一種代碼抽象的方式。 定義函數(shù)function abs(x) {if (x >=0){return...
    _我和你一樣閱讀 516評(píng)論 0 0
  • ES6標(biāo)準(zhǔn)新增了一種新的函數(shù):Arrow Function(箭頭函數(shù))。為什么叫Arrow Function? 因...
    八寶君閱讀 252評(píng)論 0 0
  • f28af672d950閱讀 167評(píng)論 0 0
  • 1.《風(fēng)雨哈佛路》 英文原版名:Breaking Night: A Memoir of Forgiveness, ...
    慕容雪洛閱讀 431評(píng)論 0 0

友情鏈接更多精彩內(nèi)容