#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);
  };
}  
瀏覽器控制臺輸出效果不是預(yù)期結(jié)果
預(yù)期結(jié)果
用閉包可以來解決這個問題,讓代碼按預(yù)期輸出

方法一:將i保存在每個段落對象的一個屬性上

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

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

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

方法三:在外面再加一層閉包,將i保存在一個局部變量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);
}

方法五:在外面再加一層閉包,返回一個函數(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)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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

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