Javascript 简单封闭困境
我试图从根本上更好地理解JavaScript的闭包 假设Node.js中有这两种不同的场景Javascript 简单封闭困境,javascript,node.js,Javascript,Node.js,我试图从根本上更好地理解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.
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
};
}
为什么在第一种情况下,变量“数据”不被记住,而在后一种情况下,它被闭包“记住”
我确信在某种语言中,声明函数和引用函数可能都会记住外部函数中的变量,但我想我想更好地理解它们之间的区别。在第二种情况下,您对变量
数据使用闭包,这就是为什么它会给出正确的结果
在第一种情况下,您只是返回函数A
,而不是在导出中关闭数据
变量在第二种情况下,您使用的是变量数据
的闭包,这就是为什么它会给出正确的结果
在第一种情况下,您只是返回函数A
,而不是关闭导出中的数据变量,因为在第一个示例中,这两个数据
不相关,并且彼此独立。因为在第一个示例中,这两个数据
不相关,彼此独立。闭包是关于词汇包含。在这个上下文中,“词法”一词指的是程序的文本结构,“词法包含”意味着一个结构在物理上被发现在另一个结构中,或者嵌套在另一个结构中。在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
没有访问数据的权限,因为它没有包含在模块上定义的函数上下文中。导出
行,这是定义数据
的地方(或者在本例中是传入的)。闭包是关于词汇包含的。在这个上下文中,“词法”一词指的是程序的文本结构,“词法包含”意味着一个结构在物理上被发现在另一个结构中,或者嵌套在另一个结构中。在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
无法访问数据
,因为它没有包含在模块上定义的函数的上下文中。exports
行是定义数据
的地方(或者在本例中是传入的地方)。在这个站点上有一个很棒的社区wiki,在这个站点上有一个很棒的社区wiki