Javascript 简单封闭困境

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.

我试图从根本上更好地理解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

   };

}
为什么在第一种情况下,变量“数据”不被记住,而在后一种情况下,它被闭包“记住”


我确信在某种语言中,声明函数和引用函数可能都会记住外部函数中的变量,但我想我想更好地理解它们之间的区别。

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


在第一种情况下,您只是返回函数
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