2015-12-29 52 views
1

我试图获取JavaScript的关闭更好的基本认识简单封闭的困境

说,我们在Node.js的这两种不同的情况

function A(){ 

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

} 


module.exports = function(data){ 

    return A; 

} 

module.exports = function(data){ 

    return function A(){ 

    console.log(data); // variable "data" will be remembered 

    }; 

} 

为什么在第一种情况下,变量“数据”不会被记住,但在后一种情况下,封锁会“记住”变量?

我确定在某些语言的某处,声明一个函数并引用一个函数可能都会记住外函数中的变量,但我想我想更好地理解它们之间的差异。

+1

关于此问题,有一个很好的社区wiki [JavaScript关闭如何工作](http://stackoverflow.com/questions/111102/how-do-javascript-closures-work?rq=1) – PSWai

回答

0

在第二种情况下,您正在使用变量data的闭包,这就是为什么它会给您正确的结果。

在第一种情况下,您只是返回功能A,而不是在exports中关闭data变量。

0

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

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被定义(或者在这种情况下,被传入)。