我试图对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”不会被记住,但在后一种情况下,闭包会“记住”它?
我肯定在某个语言的某处,声明一个函数并引用一个函数可能都记住外部函数中的变量,但我想我想更好地理解其中的差异。
答案 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
不相关且彼此独立。