JavaScript 迴圈新增事件時閉包的影響有哪些解法?

時間 2021-06-02 12:30:28

1樓:

這跟JS函式的傳參方式和事件的賦值方式有關。

1、JS函式傳參是傳值不傳址的。

2、onclick的值應該給乙個函式宣告,事件觸發時只會傳乙個event引數給宣告的函式。

如果在迴圈中使用alink[i].onclick = function() ;

i 不是這個匿名函式的引數,是傳址進去的,當onclick事件觸發的時候迴圈已經結束了,i 已經是最後乙個值了。

如果宣告 function(i)

那這個 i 就指代了 event,這時候事件觸發的時候只會彈出觸發的事件名。

而使用alink[i].onclick =(function(_i) })(i);

這裡是執行外層的匿名函式,返回內層的這個匿名函式傳給onclick。

這裡注意外層函式是立即執行的,帶乙個引數,是我們傳給它的,而不是事件觸發器

內層函式是不帶引數的,事件執行時觸發器會傳給它乙個event值。

對迴圈中的每乙個 i 都會生成乙個匿名函式,i 作為生成的匿名函式的引數,是傳值的。

相當於迴圈中當 i = 2 的時候,生成了這樣乙個函式:function() ; 賦值給了alink[2].onclick,即alink[2].

onclick = function() ;

這才是我們想要的。

PS:閉包只是個手法,而不是解決問題的核心所在。

這種手法跟下面的方法是等價的,而下面並沒有用閉包。

var al = function(param)

}

迴圈中alink[i].onlick = al(i);

JavaScript 有必要快取 for 迴圈中的 Array length 嗎?

既然看到了這個問題,我也一直在想。實際中也是有時候快取,有時候不快取。速度上 其實就是乙個問題 物件的屬性讀取開銷究竟有大。這是直譯器方面的底層問題了,這個我確實不了解。但是可以知道,陣列物件屬性有一系列下標,length和 prototype 雖然經過優化,但是讀取length相對於直接讀取基本型...

在JavaScript迴圈語句中,for 和for in 迴圈哪個效率更高?

Jim Liu 用控制台是測不出效能的,因為控制台本質上是個套了一大堆安全機制的eval,它的沙盒化程度很高。用for遍歷是比for in快的,所以陣列是決計不要用for in來遍歷的。需要遍歷乙個kv的時候,如果它的key數量較多,比如幾十上百個,先用Object.getOwnPropertyNa...

JavaScript中 ArrayBuffer 物件與 Blob 物件到底有什麼區別?

navegador 我說乙個很表面的,通常來說node比瀏覽器自由,但是瀏覽器的blob 有匹配的createObjectUrl node目前沒有直接的。這個通常看起來沒用,但是如果你不想去改底層的情況下,想實現多執行緒混合非同步分發模型的時候有用 徹底區分真非同步任務和執行緒模擬的非同步任務,然後...