歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 最簡明的JavaScript閉包解釋

最簡明的JavaScript閉包解釋

日期:2017/3/1 9:20:33   编辑:Linux編程

JavaScript是這幾年最火的編程語言之一,從前端到服務器端,再到腳本,好像沒有一個地方沒有JavaScript的身影。這個世界上任何的一種事物的存在必然有其合理性,不要以為別人都是小人得志,學習眾家的長處才能開闊視野,青出於藍。

JavaScript的閉包是其相對於好多傳統語言不太容易理解的地方,其實並不是它有多難,因為我們好多朋友都是有其他語言背景的,比如C/C++或者Java,這樣往往可能會有些先入為主的思維,導致不容易一下子轉變過來,其實稍微習慣一下就好了,大家都是高手,下面我們直入主題。

JavaScript閉包是什麼:

簡單的說就是函數套函數,JavaScript中的函數其實相當於其他語言中的對象,如果不特別說明,下面我說的函數和對象都是可以互換的, 當所有的函數都執行完了,由於內層的函數作為結果返回了,導致外層的對象仍然被引用,所以外層對象不釋放,其中的變量仍然可以使用。

明白了以上的道理,下面兩個例子就很容易理解了。

首先看第一段代碼,這段代碼的輸出結果都是10,因為 createFunctions 函數執行完後 i 的值是10, createFunctions 對象中這個時候存儲的i就是10, 而下面的代碼每次都是輸出最後的對象中的狀態i = 10, 所以結果一目了然。

function createFunctions(){
var result = new Array();

for (var i=0; i < 10; i++){
result[i] = function(){
return i;
};
}

return result;
}

var funcs = createFunctions();

//every function outputs 10
for (var i=0; i < funcs.length; i++){
document.write(funcs[i]() + "<br />");
}

執行結果:

10
10
10
10
10
10
10
10
10
10

再來看下面這段代碼createFunctions 函數執行完i也是10,但是返回的函數每次都使用的自己的局部變量num,而不是外部對象createFunctions中的i=10,所以每次的輸出結果為0-9.

function createFunctions(){
var result = new Array();

for (var i=0; i < 10; i++){
result[i] = function(num){
return function(){
return num;
};
}(i);
}

return result;
}

var funcs = createFunctions();

//function outputs 1-9
for (var i=0; i < funcs.length; i++){
document.write(funcs[i]() + "<br />");
}

執行結果:

0
1
2
3
4
5
6
7
8
9

總結

通過這兩段代碼的理解,希望大家對JavaScript閉包由一個全新的認識,JavaScript閉包是JavaScript語言的難點,也是其精髓之一,希望本文能對大家有所幫助,如果大家能有一點點的啟發,本文的目的就達到了。

Copyright © Linux教程網 All Rights Reserved