简单闭包与具有嵌套函数返回的闭包
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
.
有关更多信息,您可以在此处查看更多示例
为了了解范围,您可以参考此答案
- 使用闭包/函数绑定将自函数作为回调传递
- 了解 JavaScript 闭包函数
- 传递多个参数的闭包函数
- 将“(0)”附加到此闭包函数的目的是什么
- 如何复制(新实例)闭包函数
- Javascript 闭包函数参数
- 具有闭包函数作用域的意外行为
- javascript闭包函数可以由用户更改吗
- Javascript:是这个闭包函数
- 为什么闭包函数中的 javascript 变量在多次调用时不会重置为默认值
- Js闭包:函数在第二次调用时失败
- 如何存储闭包函数返回的变量
- javascript闭包函数的用法
- JavaScript闭包函数传递给事件监听器
- 闭包函数问题
- & # 39;这个# 39;匿名闭包函数内部
- 在JavaScript中实现自动记忆(返回闭包函数)
- 不理解闭包函数是如何工作的
- Javascript闭包函数
- 为javascript闭包函数编写jasmine测试规范