【发布时间】:2016-01-05 15:50:27
【问题描述】:
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 明确表示第一次设置存在关闭,但第二次设置不存在..
【问题讨论】:
-
只有第二个是闭包
-
@NinaScholz:如果一个闭包被定义为一个对其封闭变量范围具有永久引用的函数,那么 JS 中的每个函数都是一个闭包,无论它是否被利用。
-
@SariksaThapa:您已经描述了问题的主要区别。
-
@NinaScholz:第一个示例中的函数仍然绑定到其封闭的执行环境,即全局环境。全球环境是唯一不受任何事物约束的环境。
-
不要过分依赖控制台输出来解释语言的含义。控制台仅显示其开发人员决定应显示的内容。他们可能只是将其关闭,因为它已经由
Global表示。我已经远远超出了您的问题,但是您已经触及了两个原始代码示例之间的主要区别。names的可访问性是唯一的实际区别。
标签: javascript jquery closures