最小可行的JavaScript关闭
Stack Overflow关于JavaScript关闭的最佳答案将它们定义为(释义):
一个函数,它简单地访问您的直接词法作用域之外的变量,这些变量在函数返回后不会被释放。
严格地基于这个定义,似乎我们可以减少最小可行闭包(做一些有用的事情)到一个不包含局部变量的函数,该局部变量会改变全局范围中的某些东西:
var x = 0;
function foo() {
x = x + 1;
return x;
}
foo(); // returns 1
foo(); // returns 2, et cetera
但是,通常的示例包含嵌套函数和“封闭”变量。 这个例子是一个闭包(或者全局范围现在是闭包)? 或者定义不完整?
谢谢!
是的,这是一个关闭。 在最上面的答案中,它实际上提供了一个最简单的关闭示例:
var a = 10;
function test() {
console.log(a); // will output 10
console.log(b); // will output 6
}
var b = 6;
test();
这与您的示例基本相同,函数定义的作用域恰好与执行上下文的父级相同。
当调用Javascript函数时,会创建一个新的执行上下文。 结合函数参数和父对象,这个执行上下文也接收所有在其之外声明的变量(在上例中,'a'和'b')。
实际上,您可以使用新范围来替换示例中的全局范围:
(function(){
var x = 0;
function foo(){
x = x + 1;
console.log(x);
}
foo(); // output 1
foo(); // output 2
})();
不,因为你在这里不使用闭包,只有一个范围,全局范围,你只是使用全局变量。
你引用的定义在那里是模棱两可的:
函数返回后
在这个定义中,“返回”的“函数”是其作用域保存变量的函数,即外部函数。 由于没有外部函数,并且全局范围永远不会结束,所以没有关闭。
关闭会是这样的:
var foo = (function(){
var x = 0;
return function() {
x = x + 1;
return x;
}
})(); // the function returns but x keeps being usable by the inner function
foo(); // returns 1
foo(); // returns 2, et cetera
而一个没用的闭包就是这样的:
function makeFoo(){
var x = 0;
return function() {
x = x + 1;
return x;
}
}
var foo1 = makeFoo(), foo2 = makeFoo();
foo1(); // returns 1
foo2(); // returns 1
foo1(); // returns 2, et cetera
链接地址: http://www.djcxy.com/p/51611.html