简单的封闭困境

我正试图获得更好的JavaScriptclosures的基本理解

假设我们在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 }; } 

为什么在第一种情况下,variables“数据”不被记住,但在后一种情况下,封闭“记忆”

我确定在某个语言的某处,声明一个函数并引用一个函数可能会记住外部函数中的variables,但是我想我想更好地理解它们之间的区别。

closures是关于词汇包含 。 在这里,“词汇”这个词是指程序的文本结构,“词汇包含”是指一个构造在物理上是“内部”发现的,或者嵌套在另一个中。 在JavaScript中,函数可以访问在词汇周围(封闭)结构中定义的variables。

因此,在以下内容中:

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

函数baz在词法上被包含在foo ,它定义了variablesbar ,因此可以访问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地方(在这种情况下是传入的)。

你在第二种情况下使用variablesdata闭包,这就是为什么它给你正确的结果。

在第一种情况下,您只是返回函数A ,而不是closuresexports datavariables。

因为在你的第一个例子中,这两个data是不相关的,而且是相互独立的。