简单的闭合困境

Simple closure dilemma

本文关键字:困境 简单      更新时间:2023-09-26

我试图对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
   };
}
为什么在第一种

情况下变量"数据"没有被记住,而在后一种情况下,它被闭包"记住"了?

我确信在某些语言的某个地方,声明一个函数和一个引用一个函数可能都记得外部函数中的变量,但我想我想更好地理解其中的区别。

包是关于词汇包含的。在这种情况下,"词汇"一词是指程序的文本结构,而"词汇包含"意味着一个结构在物理上位于"内部"或嵌套在另一个结构中。在 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的位置。

您在第二种情况下对变量data使用闭包,这就是为什么它为您提供正确结果的原因。

在第一种情况下,你只是返回函数A,而不是关闭exports中的变量data

因为在第一个示例中,两个data不相关,并且彼此独立。