#javascript#用閉包的方式解決循環(huán)中的i值異常

以下代碼未按預(yù)期的效果輸出
<p>11111</p>
<p>22222</p>
<p>33333</p>
<p>44444</p>
<p>55555</p>
var pAry = document.getElementsByTagName("p"); 

for (var i = 0; i < pAry.length; i++) {
  pAry[i].onclick = function () {
    console.log(i);
  };
}  
瀏覽器控制臺(tái)輸出效果不是預(yù)期結(jié)果
預(yù)期結(jié)果
用閉包可以來解決這個(gè)問題,讓代碼按預(yù)期輸出

方法一:將i保存在每個(gè)段落對(duì)象的一個(gè)屬性上

for (var i = 0; i < pAry.length; i++) {
  pAry[i].i = i;
  pAry[i].onclick = function () {
    console.log(this.i);
  };
}

方法二:將i保存在匿名函數(shù)本身的一個(gè)屬性上

for (var i = 0; i < pAry.length; i++) {
  (pAry[i].onclick = function () {
    console.log(arguments.callee.i);
  }).i = i;
}

方法三:在外面再加一層閉包,將i保存在一個(gè)局部變量tmp上

for (var i = 0; i < pAry.length; i++) {
  (function () {
    var tmp = i;
    pAry[i].onclick = function () {
      console.log(tmp);
    };
  })();
};

方法四:在外面再加一層閉包,將i的值復(fù)制到參數(shù)num里

for (var i = 0; i < pAry.length; i++) {
  (function (num) {
    pAry[i].onclick = function () {
      console.log(num);
    };
  })(i);
}

方法五:在外面再加一層閉包,返回一個(gè)函數(shù)作為響應(yīng)事件

for (var i = 0; i < pAry.length; i++) {
  pAry[i].onclick = function (num) {
    return function () {
      console.log(num);
    }
  }(i);
}
最后編輯于
?著作權(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)容

  • 閉包機(jī)制是JavaScript的重點(diǎn)和難點(diǎn),本文希望能幫助大家輕松的學(xué)習(xí)閉包 一、什么是閉包? 閉包就是可以訪問另...
    何叔best閱讀 684評(píng)論 0 0
  • 作用域和閉包是 JavaScript 最重要的概念之一,想要進(jìn)一步學(xué)習(xí) JavaScript,就必須理解 Java...
    劼哥stone閱讀 1,249評(píng)論 1 13
  • 查閱書籍:JavaScript權(quán)威指南 函數(shù)聲明與函數(shù)表達(dá)式 用函數(shù)聲明定義的函數(shù),函數(shù)可以在函數(shù)聲明之前調(diào)用,而...
    雪萌萌萌閱讀 468評(píng)論 1 9
  • 今天學(xué)了內(nèi)部類 下面是內(nèi)部類的一些用法和要求 一個(gè).java文件可以有多個(gè)類,但是只能有一個(gè)public 內(nèi)部類可...
    慘不忍睹閱讀 174評(píng)論 0 0
  • 上次我們說到要進(jìn)行網(wǎng)絡(luò)營銷,首先得有一個(gè)落地頁,詳情請(qǐng)閱讀:婚紗攝影網(wǎng)絡(luò)營銷應(yīng)該從哪入手?。今天我們談?wù)動(dòng)辛寺涞仨?..
    禮糖網(wǎng)閱讀 1,442評(píng)論 0 0

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