最小可行的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

上一篇: Minimum viable JavaScript closure

下一篇: What exactly does "closure" refer to in JavaScript?