亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

javascript閉包傳參和事件的循環綁定示例探討

2019-11-20 20:48:56
字體:
來源:轉載
供稿:網友
今天看到一個javascript的題目,按常理循環綁定事件,但是得到的結果卻不是想要的。
復制代碼 代碼如下:

<a href="#">text</a>
<br>
<a href="#">link</a>
<script>
var as = document.getElementsByTagName('a');
for ( var i = as.length; i--; ) {
as[i].onclick = function() {
alert(i);
return false;
}
}
</script>

1.這個代碼點擊鏈接彈出的i都是-1,這是為啥呢?

簡單來說就是函數變量作用域問題,如果把function() { alert(i); return false; } 當做一個函數 a();a()內部未定義變量i,但是內部使用了,于是向外查找,找到for循環里定義的i,點擊事件是for循環完畢后才開始執行的,執行完畢后i的值已經變成-1;所以每次彈出的都是-1;

2. 2個參數的for循環也不常見!疑惑?

  for(語句1,語句2,語句3){

    //todo

  }

a.for循環條件

通常說語句1、語句2、語句3都是可選的。

b.語句 2:

  通常語句 2 用于評估初始變量的條件。

  語句 2 同樣是可選的。

  如果語句 2 返回 true,則循環再次開始,如果返回 false,則循環將結束。

  提示:如果您省略了語句 2,那么必須在循環內提供 break。否則循環就無法停下來。這樣有可能令瀏覽器崩潰。

c.關于 i--判斷:

  判斷i--true /false的時候是先判斷i再運算i--的。進入最后一次判斷 i--的時候其實判斷 i==0的時候,判斷后又執行了一次i--,for循環終止, 于是i的值變成了-1;

  var i = 1;

  !!i--;//ture

解決方法:
復制代碼 代碼如下:

var as = document.getElementsByTagName('a');
for ( var i = as.length; i--; ) {
(function(i){
as[i].onclick = function() {
alert(i);
return false;
}
})(i)
}

或者:
復制代碼 代碼如下:

var as = document.getElementsByTagName('a');
for ( var i = as.length; i--; ) {
var a = function(i){
as[i].onclick = function() {
alert(i);
return false;
}
}
a(i);
}

其他網友7中解決方法demo:
復制代碼 代碼如下:

<html >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>閉包演示</title>
<script type="text/javascript">

function init() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
pAry[i].onclick = function() {
alert(i);
}
}
}
</script>
</head>
<body onload="init();">
<p>產品一</p>
<p>產品二</p>
<p>產品三</p>
<p>產品四</p>
<p>產品五</p>
</body>
</html>

1、將變量 i 保存給在每個段落對象(p)上
復制代碼 代碼如下:

function init() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
pAry[i].i = i;
pAry[i].onclick = function() {
alert(this.i);
}
}
}

2、將變量 i 保存在匿名函數自身
復制代碼 代碼如下:

function init2() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
(pAry[i].onclick = function() {
alert(arguments.callee.i);
}).i = i;
}
}

3、加一層閉包,i以函數參數形式傳遞給內層函數
復制代碼 代碼如下:

function init3() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
(function(arg){
pAry[i].onclick = function() {
alert(arg);
};
})(i);//調用時參數
}
}

4、加一層閉包,i以局部變量形式傳遞給內存函數
復制代碼 代碼如下:

function init4() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
(function () {
var temp = i;//調用時局部變量
pAry[i].onclick = function() {
alert(temp);
}
})();
}
}

5、加一層閉包,返回一個函數作為響應事件(注意與3的細微區別)
復制代碼 代碼如下:

function init5() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
pAry[i].onclick = function(arg) {
return function() {//返回一個函數
alert(arg);
}
}(i);
}
}

6、用Function實現,實際上每產生一個函數實例就會產生一個閉包
復制代碼 代碼如下:

function init6() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
pAry[i].onclick = new Function("alert(" + i + ");");//new一次就產生一個函數實例
}
}

7、用Function實現,注意與6的區別
復制代碼 代碼如下:

function init7() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
pAry[i].onclick = Function('alert('+i+')')
}
}

總結完成,歡迎拍磚!
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线日韩日本国产亚洲| 亚洲黄一区二区| 亚洲精品在线91| 91九色蝌蚪国产| 欧美视频在线观看 亚洲欧| 韩国国内大量揄拍精品视频| 国产精品扒开腿做| 国产日韩专区在线| 欧美精品激情视频| 热久久免费视频精品| 国产精品爽爽爽爽爽爽在线观看| 中日韩午夜理伦电影免费| 久久精品免费电影| 91高潮在线观看| 国产在线视频不卡| 97碰碰碰免费色视频| 欧美裸体xxxx极品少妇软件| 日韩精品视频在线播放| 久久久久久久久久久成人| 亚洲视频777| 性金发美女69hd大尺寸| 国内免费久久久久久久久久久| 亲子乱一区二区三区电影| 国产亚洲精品日韩| 亚洲人成电影网站色xx| 亚洲国产成人久久| 日韩欧美高清视频| 久久久久中文字幕| 亚洲欧美日韩国产中文专区| 国产精品青草久久久久福利99| 日韩不卡中文字幕| 日韩国产一区三区| 欧美激情网站在线观看| 亚洲人成网7777777国产| 96精品久久久久中文字幕| 亚洲va久久久噜噜噜久久天堂| 精品国产户外野外| 亚洲在线www| 精品一区精品二区| 久久久久久久久久久网站| 日韩欧美精品网址| 国产成人久久久精品一区| 色香阁99久久精品久久久| 欧美精品videofree1080p| 日韩高清人体午夜| 欧美日韩国产在线看| 综合久久五月天| 亚洲欧美一区二区三区久久| www日韩中文字幕在线看| 久久精品国产亚洲精品2020| 国产成人综合精品在线| 亚洲午夜av久久乱码| 亚洲剧情一区二区| 国产午夜一区二区| 欧美日韩加勒比精品一区| 成人av资源在线播放| 成人福利视频在线观看| 国产精品视频资源| 国产一区二区三区精品久久久| 欧美极品少妇xxxxⅹ裸体艺术| 欧美性xxxxx极品娇小| 亚洲免费av片| 精品国内产的精品视频在线观看| 最近2019年手机中文字幕| 久久精品青青大伊人av| 国产精品视频在线播放| 欧美大秀在线观看| 中文字幕精品国产| 国产精品国产福利国产秒拍| 国产日韩换脸av一区在线观看| 日韩精品亚洲元码| 欧美另类在线播放| 亚洲剧情一区二区| 98午夜经典影视| 91精品国产高清自在线看超| 欧美精品久久久久a| 久久伊人免费视频| 国产成人精品免高潮在线观看| 亚洲成色777777女色窝| 欧美激情手机在线视频| 国产精品久久9| 成人动漫网站在线观看| 日韩免费精品视频| 一区二区欧美亚洲| 成人激情视频网| www.欧美精品一二三区| 亚洲xxxx做受欧美| 亚洲精品中文字幕女同| 亚洲成人久久久| 亚洲精品久久久久| 久久免费精品视频| 国产精品第10页| 91在线精品播放| 日韩精品在线观看一区| 欧美日韩第一页| 国产视频亚洲精品| 91精品免费视频| 日韩电视剧在线观看免费网站| 精品国产一区二区三区久久狼5月| 亚洲欧美日本另类| 日韩免费在线视频| 欧美成人免费播放| 亚洲乱码一区av黑人高潮| 欧美日韩亚洲一区二区三区| 国产精品久久久久久网站| 国产精品第1页| 欧美超级乱淫片喷水| 91精品久久久久久久久| 国产精品18久久久久久首页狼| 国产精品丝袜视频| 亚洲福利视频免费观看| 亚洲午夜未删减在线观看| 欧美多人乱p欧美4p久久| 国产精品久久久久久久久免费| 欧美激情第一页xxx| 亚洲精品suv精品一区二区| 久久久久久久网站| 中文字幕欧美专区| 黑人极品videos精品欧美裸| 亚洲欧美中文在线视频| 2025国产精品视频| 成人美女免费网站视频| 清纯唯美亚洲激情| 影音先锋欧美在线资源| 欧美高清视频在线观看| 成人免费高清完整版在线观看| 欧美性猛交xxxx免费看漫画| 日本亚洲欧洲色| 国产一区二区在线播放| 九九热最新视频//这里只有精品| 国产精品专区一| 国产精品尤物福利片在线观看| 97精品视频在线播放| 日韩**中文字幕毛片| 国产精品久久久久久久天堂| 国产精品高清网站| 亚洲电影免费观看高清完整版| 日韩欧美主播在线| 日韩在线视频免费观看高清中文| 亚洲成人免费网站| 福利精品视频在线| 日韩经典第一页| 欧美在线视频观看| 国产91露脸中文字幕在线| 日韩精品极品在线观看播放免费视频| 美乳少妇欧美精品| 亚洲精品欧美一区二区三区| 另类专区欧美制服同性| 91亚洲精品在线观看| 91久久久久久久久久久久久| 亚洲高清不卡av| 色婷婷综合久久久久中文字幕1| 精品一区二区三区四区在线| 91九色蝌蚪国产| 国产a∨精品一区二区三区不卡| 色综合久久悠悠| 久久久女人电视剧免费播放下载| 欧美美女15p| 成人福利视频在线观看| 色噜噜狠狠狠综合曰曰曰| 国产成人一区二区三区小说| 97**国产露脸精品国产| 一道本无吗dⅴd在线播放一区| 国产精品成人va在线观看|