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

淺談js for循環(huán)輸出i為同一值的問題

 更新時間:2017年03月01日 08:41:29   投稿:jingxian  
下面小編就為大家?guī)硪黄獪\談js for循環(huán)輸出i為同一值的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

1、最近開發(fā)中遇到一個問題,為什么每次輸出都是5,而不是點擊每個p,就alert出對應(yīng)的1,2,3,4,5。

代碼如下:

<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
<title>閉包演示</title> 
</head>  
<body>  
<p>1</p>  
<p>2</p>  
<p>3</p>  
<p>4</p>  
<p>5</p> 
<script type="text/javascript">
window.onload=function() {  
 var ps = document.getElementsByTagName("p");  
 for( var i=0; i<ps.length; i++ ) {  
   ps[i].onclick = function() {  
   alert(i);  
 }  
 }  
}  
</script> 
</body>  
</html>

此時點擊任意p彈出的都是5

出現(xiàn)原因:js事件處理器在線程空閑時間不會運行,導致最后運行的時候輸出的都是i最后的值,即:5

2、解決辦法:使用閉包將變量i的值保護起來。

//sava1:加一層閉包,i以函數(shù)參數(shù)形式傳遞給內(nèi)層函數(shù) 
 for( var i=0; i<ps.length; i++ ) {  
 (function(arg){   
  ps[i].onclick = function() {   
   alert(arg);  
  };  
 })(i);//調(diào)用時參數(shù)  
 } 


//save2:加一層閉包,i以局部變量形式傳遞給內(nèi)存函數(shù) 
 for( var i=0; i<ps.length; i++ ) {  
 (function () {  
  var temp = i;//調(diào)用時局部變量  
  ps[i].onclick = function() {  
  alert(temp);  
  }  
 })();  
 }


//save3:加一層閉包,返回一個函數(shù)作為響應(yīng)事件(注意與3的細微區(qū)別) 
 for( var i=0; i<ps.length; i++ ) {  
 ps[i].onclick = function(arg) {  
  return function() {//返回一個函數(shù)  
  alert(arg);  
  }  
 }(i);  
 } 


//save4:將變量 i 保存給在每個段落對象(p)上  
 for( var i=0; i<ps.length; i++ ) {  
  ps[i].i = i;  
  ps[i].onclick = function() {  
  alert(this.i);  
  }  
 }


//save5:將變量 i 保存在匿名函數(shù)自身  
 for( var i=0; i<ps.length; i++ ) {  
 (ps[i].onclick = function() {  
  alert(arguments.callee.i);  
 }).i = i;  
 }   
} 


//save6:用Function實現(xiàn),實際上每產(chǎn)生一個函數(shù)實例就會產(chǎn)生一個閉包
 for( var i=0; i<ps.length; i++ ) {  
  ps[i].onclick = new Function("alert(" + i + ");");//new一次就產(chǎn)生一個函數(shù)實例 
 } 


//save7:用Function實現(xiàn),注意與6的區(qū)別  
 for( var i=0; i<ps.length; i++ ) {  
   ps[i].onclick = Function('alert('+i+')'); 
 }

以上這篇淺談js for循環(huán)輸出i為同一值的問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • JavaScript 程序編碼規(guī)范

    JavaScript 程序編碼規(guī)范

    這是一套適用于JavaScript程序的編碼規(guī)范。它基于Sun的Java程序編碼規(guī)范。但進行了大幅度的修改, 因為JavaScript不是Java。
    2010-11-11
  • JavaScript生成隨機驗證碼代碼實例

    JavaScript生成隨機驗證碼代碼實例

    這篇文章主要介紹了JavaScript生成隨機驗證碼代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • JavaScript實現(xiàn)圖片懶加載(Lazyload)

    JavaScript實現(xiàn)圖片懶加載(Lazyload)

    這篇文章主要介紹了JavaScript實現(xiàn)圖片懶加載(Lazyload)的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • Layer+Echarts構(gòu)建彈出層折線圖的方法

    Layer+Echarts構(gòu)建彈出層折線圖的方法

    今天小編就為大家分享一篇Layer+Echarts構(gòu)建彈出層折線圖的方法,具有很的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • ant design中實現(xiàn)table的表格行的拖拽

    ant design中實現(xiàn)table的表格行的拖拽

    這篇文章主要介紹了ant design中實現(xiàn)table的表格行的拖拽,文章圍繞table表格行拖拽實現(xiàn)的相關(guān)資料展開詳細的代碼內(nèi)容,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-03-03
  • JavaScript中判斷字符串是否為空的幾種常用方法

    JavaScript中判斷字符串是否為空的幾種常用方法

    JavaScript字符串的判空方法有很多種,下面這篇文章主要給大家介紹了關(guān)于JavaScript中判斷字符串是否為空的幾種常用方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-07-07
  • 原生JS實現(xiàn)隱藏顯示圖片 JS實現(xiàn)點擊切換圖片效果

    原生JS實現(xiàn)隱藏顯示圖片 JS實現(xiàn)點擊切換圖片效果

    這篇文章主要為大家詳細介紹了原生JS實現(xiàn)隱藏顯示圖片,JS實現(xiàn)點擊切換圖片效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 微信小程序自定義音樂進度條的實例代碼

    微信小程序自定義音樂進度條的實例代碼

    最近遇到這樣的需求:顯示音樂播放按鈕、可手動拖拽進度條;頁面中含多個音樂,播放當前音樂時暫停其他音樂播放。 這篇文章主要介紹了微信小程序自定義音樂進度條的實例代碼,需要的朋友可以參考下
    2018-08-08
  • 使用bootstrap3開發(fā)響應(yīng)式網(wǎng)站

    使用bootstrap3開發(fā)響應(yīng)式網(wǎng)站

    這篇文章主要為大家詳細介紹了使用bootstrap3開發(fā)響應(yīng)式網(wǎng)站的具體代碼,感興趣的小伙伴們可以參考一下
    2016-05-05
  • JavaScript生成驗證碼并實現(xiàn)驗證功能

    JavaScript生成驗證碼并實現(xiàn)驗證功能

    這篇文章主要介紹了JavaScript生成驗證碼并實現(xiàn)驗證功能的相關(guān)資料,代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09

最新評論

永康市| 宣汉县| 平遥县| 汤阴县| 汤阴县| 丰台区| 宁陵县| 休宁县| 特克斯县| 田林县| 乌什县| 宝山区| 林周县| 大丰市| 屏南县| 长白| 安吉县| 赞皇县| 扎兰屯市| 定结县| 三穗县| 武强县| 麦盖提县| 诏安县| 乐业县| 吉安县| 桃园县| 琼结县| 民县| 金溪县| 隆尧县| 工布江达县| 沾益县| 崇仁县| 谢通门县| 邛崃市| 昌邑市| 昔阳县| 安宁市| 喀喇沁旗| 肇东市|