简单闭包与具有嵌套函数返回的闭包

simple closure vs closure with nested function return

本文关键字:闭包 函数 返回 嵌套 简单      更新时间:2023-09-26
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.

有关更多信息,您可以在此处查看更多示例

为了了解范围,您可以参考此答案