简单的封闭困境
我正试图获得更好的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
data
variables。
因为在你的第一个例子中,这两个data
是不相关的,而且是相互独立的。