简单的封闭困境

时间:2015-12-29 04:17:30

标签: javascript node.js

我试图对JavaScript的闭包有更好的基本理解

说我们在Node.js中有这两种不同的场景

/* istanbul ignore next */

function A(){

 console.log(data);  //this should give us a null pointer

}


module.exports = function(data){

    return A;

}

为什么在第一种情况下变量“data”不会被记住,但在后一种情况下,闭包会“记住”它?

我肯定在某个语言的某处,声明一个函数并引用一个函数可能都记住外部函数中的变量,但我想我想更好地理解其中的差异。

3 个答案:

答案 0 :(得分:4)

关闭是关于词汇包含。在这种情况下,“词汇”一词指的是程序的文本结构,而“词汇包含”是指一个结构在物理上“内部”或嵌套在另一个内部。在JavaScript中,函数可以访问在词法周围(封闭)结构中定义的变量。

因此,在以下内容中:

function foo() {
  var bar;
  return function baz() {
    console.log(bar);
  };
}

函数baz在词汇表中包含在foo中,用于定义变量bar,因此可以访问bar。即使从其他地方返回并调用它,它仍然可以访问bar

var fooFunc = foo();
fooFunc();            // continues to have access to bar

在你的例子中:

function A(){
  console.log(data);  //this should give us a null pointer
}

module.exports = function(data) {
  return A;
}

A无法访问data,因为它不是词汇性地包含在module.exports行定义的函数的上下文中,data是{{1}}定义(或在这种情况下,传入)。

答案 1 :(得分:0)

你在第二种情况下使用变量$ ipython script.py stuff things that The script is called: ex13.py Your first variable is: stuff Your second variable is: things Your third variable is: that 的闭包,这就是为什么它会给你正确的结果。

在第一种情况下,您只需返回data函数,而不是A中的data变量。

答案 2 :(得分:0)

因为在您的第一个示例中,两个data不相关且彼此独立。