JavaScript中在使用閉包時的陷阱

2021-09-25 06:14:33 字數 1964 閱讀 5657

在日常的學習和開發中,我們或多或少會使用閉包。但是如果觀察不仔細,我們可能不知道有些**是怎麼執行的,這裡面可能就有個陷阱的理解誤區了。

看下面這段**:

function

test()

//產生閉包

}return arr;

}var result =

test()

;for

(var i=

0;i)//5 5 5 5 5

這段**的執行結果都是5,我們本來想輸出每個索引的,但是輸出的都是5,這裡的陷阱就是函式帶 () 才是執行函式,這句話真的很重要。

其實上面**的流程相當於:

function test(){} //函式宣告提公升

var result,i; //變數宣告提公升

test(); //先執行函式,再將結果賦值給 result

var arr,i; //函式內部的變數宣告提公升

arr[0] = function(); //函式沒有執行,內部變數值不變,不能將函式內部的 i 替換

arr[1] = function(); //函式沒有執行,內部變數值不變,不能將函式內部的 i 替換

.....

arr[4] = function(); //函式沒有執行,內部變數值不變,不能將函式內部的 i 替換

i = 5; //for迴圈的結束條件

result = test(); //將函式test的執行返回值賦值給result,相當於 result = arr;

console.log(result[0]()); //列印內部函式的執行結果,返回 i

console.log(result[1]()); //列印內部函式的執行結果,返回 i

.....

console.log(result[4]()); //列印內部函式的執行結果,返回 i

由於我們最後結束for迴圈的條件是 i=5; 所以返回值都為 5。

想要儲存迴圈過程中的每乙個 i 的值,需要在匿名函式的外部再巢狀乙個匿名函式,並且在外層匿名函式中定義另乙個變數並且立即執行來儲存 i 的值。

function

test()

;}(i);

}return arr;

}var result =

test()

;for

(var i=

0;i)

上面的**的執行流程相當於:

function test(){};

var result,i;

test();

var arr,i;

arr[0] = function(num)}(0)//這句**相當於執行了外層的匿名函式並且傳入了實參0,所以此時num的值為0。

即arr[0] = function();

arr[1] = function();

arr[4] = function();

i = 5;

result = test() = arr;

var result,i;

console.log(result[0]()); //返回 0

console.log(result[1]()); //返回 1

.....

console.log(result[4]()); // 返回 4

此時test執行完畢後,其內部的區域性變數i會隨著其函式作用域的銷毀而銷毀,而不會一直儲存在記憶體中了。每次呼叫test()時,都會重新的宣告i,根據傳入的實參,確定i的值,而閉包內部的num只是作為外層函式的形參,並不影響外部的i

javascript閉包使用

之前看到一段 很是不能理解,然後就查詢資料並且找網路上得大牛請教,最後弄懂了這段 然後就拿出來總結一下。先來看一段 var arrtest for var i 0 i 3 i arrtest function function function console.log arrtest 0 tostr...

javaScript中的閉包

首先,我覺得,乙個概念,如果不理解也不影響使用的話,那麼,就沒必要去理解它 去學習它。閉包就是這樣乙個概念,你不理解它也能很好的用它。俺這兩年寫as3程式,是天天在和它打交道,甚至有過乙個function套乙個,乙個方法中套了20多個function的極端例子,但從未深究過它是怎麼實現的,它就像水和...

javascript中的閉包

1.閉包的解釋 關於閉包具體的定義文獻中給的概念很抽象,我認為閉包是一種使函式能夠都去其它函式的區域性變數的語法機制。舉個例子 functionoutfunc returninfunc infunc 控制台顯示 vicfeel 這這個例子我們可以看出,在函式infunc中依然可以訪問outfunc的...