簡體   English   中英

簡單閉包與帶有嵌套函數返回的閉包

[英]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都創建一個閉包,就這么簡單。

不要讓設置閉包的不同方式(函數語句,函數表達式或立即執行的函數表達式)使您感到困惑,最終它們全都是同一件事。

首先,讓我們了解簡單的詞是什么。

閉包是一個內部函數,可以訪問外部函數(包裝函數)的變量。

現在,閉包函數具有訪問具有三個不同作用域的變量的神奇能力。

  1. 它是局部作用域的變量。
  2. 它是外部函數范圍的變量。
  3. 全局范圍變量。

現在,如果我們同時介紹您所描述的兩種情況。

首先:

var names = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight"];
var digit_name = function(n){ 
                    return names[n];
                 }
//Execute

digit_name(0)

在這里,變量namesdigit_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM