最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你搞懂JavaScript中this綁定問題

 更新時間:2026年04月01日 08:32:33   作者:卷簾依舊  
在JavaScript中,當(dāng)在回調(diào)函數(shù)中使用this時,經(jīng)常會出現(xiàn)this指向丟失的問題,本文檔詳細(xì)分析了這個問題及其解決方案,有需要的小伙伴可以參考下

問題描述

在JavaScript中,當(dāng)在回調(diào)函數(shù)(如setTimeout)中使用this時,經(jīng)常會出現(xiàn)this指向丟失的問題。本文檔詳細(xì)分析了這個問題及其解決方案。

示例代碼分析

原始代碼

var obj = {
    count: 0,
    cool: function coolFn() {
        var self = this;

        if (self.count < 1) {
            setTimeout(function timer() {
                self.count++;
                console.log('awesome?');
            }, 100);
        }
    }
}

obj.cool();

代碼執(zhí)行流程

  • 步驟1: 執(zhí)行 obj.cool(),調(diào)用cool方法
  • 步驟2: 在cool方法內(nèi)部,this指向obj對象,通過var self = this;保存這個引用
  • 步驟3: 條件判斷 self.count < 1true(初始值為0)
  • 步驟4: 設(shè)置setTimeout定時器,延遲100ms執(zhí)行
  • 步驟5: cool方法執(zhí)行完畢
  • 步驟6: 100ms后定時器觸發(fā),執(zhí)行回調(diào)函數(shù)
  • 步驟7: self.count++ 將count變?yōu)?,輸出"awesome?"

var self = this的工作原理

1. 調(diào)用時的this指向

當(dāng)執(zhí)行 obj.cool() 時,根據(jù)隱式綁定規(guī)則,函數(shù)內(nèi)的this指向obj對象本身。

obj.cool();  // 此時cool函數(shù)內(nèi)的this指向obj

2. 保存this引用

var self = this;

這行代碼的作用:

  • 將當(dāng)前this(指向obj)的引用保存到局部變量self
  • self變量存儲的是對obj對象的引用
  • 通過閉包機(jī)制,這個引用在定時器回調(diào)函數(shù)中仍然可訪問

3. 解決this丟失問題

如果沒有保存this引用:

// ? 錯誤示例 - this指向丟失
setTimeout(function timer() {
    this.count++;  // this指向全局對象或undefined,不是obj
}, 100);

// ? 正確示例 - 使用self
setTimeout(function timer() {
    self.count++;  // self仍指向obj
}, 100);

閉包的作用

timer回調(diào)函數(shù)形成了閉包:

function coolFn() {
    var self = this;  // 外層函數(shù)作用域

    return function timer() {
        // 內(nèi)層函數(shù)可以訪問外層函數(shù)的self變量
        self.count++;
    };
}

閉包特性:

  • 即使coolFn函數(shù)執(zhí)行完畢,self變量仍然存在于內(nèi)存中
  • timer函數(shù)引用著self變量,所以不會被垃圾回收
  • 定時器觸發(fā)時,仍然可以訪問到保存的self引用

三種解決this綁定問題的方法

方法1:使用箭頭函數(shù)(推薦)

var obj = {
    count: 0,
    cool: function coolFn() {
        if (this.count < 1) {
            setTimeout(() => {
                // 箭頭函數(shù)不改變this指向,this仍然指向obj
                this.count++;
                console.log('awesome?');
            }, 100);
        }
    }
}

obj.cool();

特點(diǎn):

  • 箭頭函數(shù)沒有自己的this,繼承外層作用域的this
  • 代碼簡潔優(yōu)雅
  • ES6語法,現(xiàn)代瀏覽器和Node.js都支持

方法2:使用bind綁定

var obj = {
    count: 0,
    cool: function coolFn() {
        if (this.count < 1) {
            setTimeout(function timer() {
                this.count++;
                console.log('awesome?');
            }.bind(this), 100);  // 使用bind將this綁定到當(dāng)前函數(shù)的this
        }
    }
}

obj.cool();

特點(diǎn):

  • 使用Function.prototype.bind方法顯式綁定this
  • 代碼稍長,但意圖明確
  • 兼容性較好(ES5)

方法3:使用var self = this(經(jīng)典方案)

var obj = {
    count: 0,
    cool: function coolFn() {
        var self = this;  // 保存this引用

        if (this.count < 1) {
            setTimeout(function timer() {
                self.count++;  // 使用保存的引用
                console.log('awesome?');
            }, 100);
        }
    }
}

obj.cool();

特點(diǎn):

  • 經(jīng)典解決方案,兼容性最好
  • 適合需要支持舊版瀏覽器的場景
  • 需要額外的變量聲明

三種方法對比

方法特點(diǎn)代碼簡潔性兼容性推薦度
var self = this經(jīng)典方案,兼容性好ES3???
箭頭函數(shù)不改變this指向ES6+?????
bind(this)顯式綁定ES5????

在項(xiàng)目中的應(yīng)用建議

推薦使用箭頭函數(shù)方案,因?yàn)椋?/p>

  • 代碼更簡潔優(yōu)雅
  • 符合現(xiàn)代JavaScript開發(fā)習(xí)慣
  • TypeScript對箭頭函數(shù)有良好支持
  • 提高代碼可讀性和維護(hù)性

補(bǔ)充:this指向規(guī)則總結(jié)

  • 默認(rèn)綁定: 嚴(yán)格模式下指向undefined,非嚴(yán)格模式指向全局對象
  • 隱式綁定: 調(diào)用時使用對象,this指向該對象
  • 顯式綁定: 使用call、applybind顯式指定this
  • new綁定: 使用new調(diào)用構(gòu)造函數(shù),this指向新創(chuàng)建的對象
  • 箭頭函數(shù): 繼承外層作用域的this,不能被改變

到此這篇關(guān)于一文帶你搞懂JavaScript中this綁定問題的文章就介紹到這了,更多相關(guān)JavaScript this綁定內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

  • 函數(shù)window.open實(shí)現(xiàn)關(guān)閉所有的子窗口

    函數(shù)window.open實(shí)現(xiàn)關(guān)閉所有的子窗口

    這篇文章主要介紹了函數(shù)window.open實(shí)現(xiàn)關(guān)閉所有的子窗口的相關(guān)資料,需要的朋友可以參考下。
    2015-08-08
  • javascript 數(shù)組使用方法匯總

    javascript 數(shù)組使用方法匯總

    由于javascript是一種無類型語言,所以一個數(shù)組的元素可以具有任意的數(shù)據(jù)類型,同一個數(shù)組的不同元素 可以具有不同的類型,數(shù)組的元素設(shè)置可以包含其他數(shù)組,這樣就可以創(chuàng)建一個復(fù)雜的數(shù)組了.
    2009-12-12
  • JavaScript實(shí)現(xiàn)刪除數(shù)組重復(fù)元素的5種常用高效算法總結(jié)

    JavaScript實(shí)現(xiàn)刪除數(shù)組重復(fù)元素的5種常用高效算法總結(jié)

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)刪除數(shù)組重復(fù)元素的5種常用高效算法,結(jié)合實(shí)例形式總結(jié)分析了javascript刪除數(shù)組重復(fù)元素的幾種常見操作技巧,需要的朋友可以參考下
    2018-01-01
  • JS實(shí)現(xiàn)五星好評案例

    JS實(shí)現(xiàn)五星好評案例

    這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)五星好評案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 原生javascript實(shí)現(xiàn)的全屏滾動功能示例

    原生javascript實(shí)現(xiàn)的全屏滾動功能示例

    這篇文章主要介紹了原生javascript實(shí)現(xiàn)的全屏滾動功能,涉及javascript事件響應(yīng)及頁面元素屬性動態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-09-09
  • js實(shí)現(xiàn)鼠標(biāo)滑動到某個div禁止?jié)L動

    js實(shí)現(xiàn)鼠標(biāo)滑動到某個div禁止?jié)L動

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)鼠標(biāo)滑動到某個div禁止?jié)L動,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • bootstrap模態(tài)框嵌套、tabindex屬性、去除陰影的示例代碼

    bootstrap模態(tài)框嵌套、tabindex屬性、去除陰影的示例代碼

    這篇文章主要介紹了bootstrap模態(tài)框嵌套、tabindex屬性、去除陰影,需要的朋友可以參考下
    2017-10-10
  • 有關(guān)div頁面拖動、縮放、關(guān)閉、遮罩效果代碼

    有關(guān)div頁面拖動、縮放、關(guān)閉、遮罩效果代碼

    有關(guān)div頁面拖動、縮放、關(guān)閉、遮罩效果代碼,比較不錯,適合學(xué)習(xí)用。
    2009-08-08
  • javascript實(shí)現(xiàn)仿百度圖片的瀑布流加載效果

    javascript實(shí)現(xiàn)仿百度圖片的瀑布流加載效果

    這是一款仿照百度圖片的瀑布流效果,可以無限加載,兼容各大主流瀏覽器,這里分享給大家,希望小伙伴們能夠喜歡
    2016-04-04
  • 最新評論

    五峰| 长子县| 玉溪市| 龙陵县| 阳新县| 八宿县| 成武县| 阳春市| 仲巴县| 三门县| 温泉县| 区。| 巴彦淖尔市| 黔东| 三明市| 寻甸| 滦南县| 青州市| 沙雅县| 抚顺市| 桓台县| 南川市| 新乡县| 宜良县| 旅游| 自贡市| 内乡县| 洛浦县| 历史| 洛南县| 四川省| 宁安市| 右玉县| 江川县| 肇州县| 察隅县| 墨脱县| 宁德市| 伊宁市| 汉源县| 浮山县|