以上**期望依次輸出0,1,2,3,4,實際卻輸出5,5,5,5,5,這是因為閉包導致,下來來具體介紹:
for迴圈是乙個外部閉包,依次繫結的點選事件是乙個函式例項,也產生了乙個閉包域,它引用了外部閉包的變數i,外部閉包域中i的最終值為5,點選事件觸發時引用外部閉包變數i(此時i=5),所以輸出的值全為5。
解決方案
方法一:增加若干個對應的閉包域空間(採用匿名函式實現)專門用來儲存原先需要引用的內容(下標值),只限於基本型別(基本型別值傳遞,物件型別引用傳遞)
for(var i = 0; ifor(var i=0; i//繫結的函式中的function scope中的closure物件的引用arg是指向將其返回的匿名函式的私有變數arg
for(var i = 0; i"use strict";
var arr = document.getelementsbytagname("p");
for(var i = 0; i}---------------------
原文:
js閉包解決多個點選事件
通常我們在前端中要為若干個節點新增相同的事件,為了減少 量便想出使用上面的 對這些節點進行迴圈繫結事件。然而事情並未像之前預想到的那樣,實驗後會發現無論點選哪個元素都會彈出several.length,而不是我們之前預想的i。這正是閉包 匿名函式 要使用外部作用於中變數的結果。而卻,這也是由於匿名函...
Js閉包與迴圈
目標 點選任何乙個li,提示當前點選位置 1 先執行 1 位置,彈出5次警示框從0到4,執行的是for語句,i 在for內部已經變為5 2 li i 是獲取的li的htmlcollection物件,i i 相當於li.item i 3 為li i 繫結事件,li i onclick 實際上此時執行的...
js 中的閉包
先理解 js 中的執行環境 閉包按中文的意思就是關上乙個包的意思。如果我們把函式的變數物件當做是乙個包的話,那這個詞很形象體現了它的作用 函式被呼叫時會建立它的執行環境,函式語句執行完後程式會自動銷毀這個函式的執行環境,但是當乙個函式中宣告了另乙個函式 子函式 並且如果存在對這個子函式引用,就會形成...