5

引用 Stoyan Stefanov 的面向对象的 JavaScript(第 84 页):

在此处输入图像描述

如果你在 a 点,你就在全局空间内。如果您在函数 F 的空间内的点 b,那么您可以访问全局空间和 F 空间。如果你在函数 N 内部的点 c,那么你可以访问全局空间、F 空间和 N 空间你无法从 a 到达 b,因为 b 在 F 之外是不可见的。但是你可以如果需要,从 c 到 b,或者从 N 到 b。有趣的事情——闭包——发生在 N 以某种方式突破 F 并最终进入全局空间时。”

我认为上面的粗体句应该改成“如果你在函数N内部的c点,那么你可以访问全局空间和N空间”(不应该包含F空间,因为点 c 只能访问 N 空间和全局范围 G。)。

我对吗?谢谢。

4

5 回答 5

2

不,我认为这N是一个从 function 返回的函数F,因此可以(通过闭包)访问b在内部声明的变量F。例如(现场示例):

function F() {
    var b = 10;
    return function () {
        console.log(b);
    };      
}

var N = F(); //N is a reference to the anonymous function returned from F

N(); //logs '10' because we still have access to b (because of the closure)
于 2012-10-05T10:17:48.253 回答
1

不,你不对。

虚线圆圈应该代表 的真实范围N,如在里面F

于 2012-10-05T10:17:58.323 回答
1

不,在 c 点你实际上可以访问他的 F 空间。

一个例子:

function F() {

  var b = 42;

  function N() {
    alert(b);
  }

  return N;

}

// get a reference to the function N in the global scope:
var n = F();
n(); // shows 42
于 2012-10-05T10:19:37.340 回答
1

正如其他人所说,没有。

关于闭包的全部要点是,对内部函数的外部引用不仅使该内部函数保持活动状态,而且还允许它访问创建它的外部环境,即使该外部环境来自执行的函数已完成并返回。

我认为如果蓝色N显示在里面F,而虚线版本(对 的引用N)显示在外面,该图将更好地说明关闭F

引用语句的最后一句也可以改进:

有趣的事情——闭包——发生在 F 之外存在对 N 的外部引用时。

请注意,此版本避免提及全局空间。任何外部范围都足以形成闭包。

该声明可以进一步说,允许形成闭包的机制是抑制垃圾收集。

警告:在网络和书籍中,有很多关于“关闭”的错误定义和描述。Stack Overflows 当前的“闭包”标签 wiki 条目就是一个很好的例子。

于 2012-10-06T01:27:36.653 回答
1

不,你错了,看下面的代码。

// the global space
var g = 'g';

function F() {
  // the F space
  var a = 'a';
  function N () {
    // the N space
    // here you could access g in the global space and a in the F space.
    var c = 'c';
    console.log(g, a);
  }
}
于 2012-10-05T10:20:18.013 回答