[英]simple closure vs closure with nested function return
var names = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight"];
var digit_name = function(n){
return names[n];
}
//Execute
digit_name(0)
與
var digit_name = (function() {
var names = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight"];
return function(n) {
return names[n];
}
})();
然后像這樣執行它:
digit_name(2)
我知道這兩個都是閉包,但我也認為兩者的設置方式之間存在一些根本差異。 有人可以指出這兩種設置有何不同(特別是考慮到兩者都完成相同的工作)嗎? 我可以想到將一個全局變量附加到“窗口”與嵌套函數以模擬私有變量。
編輯-我現在很困惑是否將第一個設置視為閉包...使用chrome,我調查了這兩個設置。
var digit_name = (function() {
var names = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight"];
return function(n) {
return names[n];
}
})();
undefined
console.dir(digit_name)
function anonymous(n)
arguments: null
caller: null
length: 1
name: ""prototype: Object
__proto__: function()
<function scope>
Closure names: Array[9]
With Block: CommandLineAPI
Global: Window
但是,對於chrome的第一個功能,
var names = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight"];
var digit_name = function(n){
return names[n];
}
undefined
console.dir(digit_name)
function digit_name(n)
arguments: null
caller: null
length: 1
name: ""
prototype: digit_name
__proto__: function()
<function scope>
With Block: CommandLineAPI
Global: Window
您可以看到Chrome明確指示第一個設置存在閉包,而第二個設置則不存在。
我知道這兩個都是關閉
正確。
但我也認為兩者的設置方式之間存在一些根本差異。
錯誤。
這個:
var names = ["zero", "one", "two"]; // outer scope variable
var digit_name = function (n) { // closure -------+
return names[n]; // outer scope variable reference |
} // ---------------+
和這個
var digit_name = (function() { // closure --------+
var names = ["zero", "one", "two"]; // outer scope variable |
return function(n) { // closure ---+ |
return names[n]; // outer scope variable reference | |
} // -----------+ |
})(); // ----------------+
在功能上是完全一樣的,唯一真正的區別是關閉的數量。
JavaScript中的每個function
都創建一個閉包,就這么簡單。
不要讓設置閉包的不同方式(函數語句,函數表達式或立即執行的函數表達式)使您感到困惑,最終它們全都是同一件事。
首先,讓我們了解簡單的詞是什么。
閉包是一個內部函數,可以訪問外部函數(包裝函數)的變量。
現在,閉包函數具有訪問具有三個不同作用域的變量的神奇能力。
- 它是局部作用域的變量。
- 它是外部函數范圍的變量。
- 全局范圍變量。
現在,如果我們同時介紹您所描述的兩種情況。
首先:
var names = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight"];
var digit_name = function(n){
return names[n];
}
//Execute
digit_name(0)
在這里,變量names
和digit_name
具有直接聲明的全局范圍,在瀏覽器的情況下是window
(即,您可以使用window.names
來訪問它)。 現在,存儲在digit_name
的函數顯然正在訪問全局變量。
所以在這里
closure
沒有在那里進來的畫面。 (這是訪問全局變量的函數的簡單示例。
第二:
var digit_name = (function() {
var names = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight"];
return function(n) {
return names[n];
}
})();
在這里, digit_name
具有全局范圍,並且存儲在digit_name
的函數是一個closure
,因為它包裝在外部函數( anonymous
)中,該外部函數在聲明后立即被調用。 現在,變量names
具有局部作用域,因為它是在函數內部聲明的,而closure
函數正在訪問此函數的局部變量,因為它屬於外部(包裝器)函數的范圍。
這是關閉函數的示例。
希望這可以幫助您了解closure
。
有關更多信息,您可以在此處查看更多示例
為了了解范圍,您可以參考此答案
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.