Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对JavaScript闭包的工作原理感到困惑吗_Javascript_Closures - Fatal编程技术网

对JavaScript闭包的工作原理感到困惑吗

对JavaScript闭包的工作原理感到困惑吗,javascript,closures,Javascript,Closures,我认为这是一个愚蠢的问题,但是考虑到这个JavaScript代码 函数outerFun { var a=0; 娱乐功能 { a++; 艾尔塔; } 回归内心的乐趣; } var obj=外部风; obj//1. obj//2. var obj2=outerFun; obj2//1. obj2//2. 我理解为什么在obj的前两次调用中结果是1,然后是2,但我不明白为什么obj2在两次调用obj后返回1而不返回3。当您第二次执行outerfun时,新的a被定义为值0。当您第二次执行outerfun

我认为这是一个愚蠢的问题,但是考虑到这个JavaScript代码

函数outerFun { var a=0; 娱乐功能 { a++; 艾尔塔; } 回归内心的乐趣; } var obj=外部风; obj//1. obj//2. var obj2=outerFun; obj2//1. obj2//2.
我理解为什么在obj的前两次调用中结果是1,然后是2,但我不明白为什么obj2在两次调用obj后返回1而不返回3。

当您第二次执行outerfun时,新的a被定义为值0。

当您第二次执行outerfun时,新的a是用值0定义的。

因为每次调用outerFun时,您都在创建一个不同的新执行上下文,因此innerFun实际上并不是一回事,因为从outerFun返回的对innerFun的每个函数引用都在一个不同的上下文中,一个具有自己变量的上下文

function outerFun()
{
 var a=0;
 function innerFun()
 {
  a++;
  alert(a);
 }
 return innerFun;  
}
var obj = outerFun();
var obj2 = outerFun();
console.log(obj === obj2);
// Not equal, because innerFun is a different innerFun for each function call,
// as it is the same function name, returned from the same function,
// but in a different context.
obj();  //1
obj();  //2
obj2();  //1
obj2();  //2

// Call obj twice, it'll increase to 4.
// While calling obj2 once again, leaves it at 3.
// This way you can know that obj and obj2 are not modifying
// the same variables.
// They are independent of each other.
obj(); // 3
obj(); // 4
obj2(); // 3

因为每次调用outerFun时,您都在创建一个不同的新执行上下文,因此innerFun实际上并不相同,因为从outerFun返回的对innerFun的每个函数引用都位于不同的上下文中,一个具有自己变量的上下文中

function outerFun()
{
 var a=0;
 function innerFun()
 {
  a++;
  alert(a);
 }
 return innerFun;  
}
var obj = outerFun();
var obj2 = outerFun();
console.log(obj === obj2);
// Not equal, because innerFun is a different innerFun for each function call,
// as it is the same function name, returned from the same function,
// but in a different context.
obj();  //1
obj();  //2
obj2();  //1
obj2();  //2

// Call obj twice, it'll increase to 4.
// While calling obj2 once again, leaves it at 3.
// This way you can know that obj and obj2 are not modifying
// the same variables.
// They are independent of each other.
obj(); // 3
obj(); // 4
obj2(); // 3
当您运行outerFun时,它会创建一个新函数并返回它。每次你打电话它都会这样。它返回的每个函数实际上都是一个全新的函数,与您之前调用它时创建的函数无关,尽管它们内部的代码是相同的

当你达到这个声明

var obj2=outerFun();
…实际上,您正在创建一个新对象,该对象在其父作用域中有自己的副本。所以如果你打电话给obj,你实际上会得到三个;在实例化obj2之后再次。他们每个人都有自己的一个变量。希望对示例的这种修改是有意义的:

function outerFun()
{
    var a=0;
    function innerFun()
    {
        a++;
        alert(a);
    }
    return innerFun;  
}
var obj=outerFun();
obj();  //1
obj();  //2
var obj2=outerFun();
obj();  //3
obj();  //4
obj2();  //1
obj2();  //2
obj();  //5
有意义吗?

当您运行outerFun时,它会创建一个新函数并返回它。每次你打电话它都会这样。它返回的每个函数实际上都是一个全新的函数,与您之前调用它时创建的函数无关,尽管它们内部的代码是相同的

当你达到这个声明

var obj2=outerFun();
…实际上,您正在创建一个新对象,该对象在其父作用域中有自己的副本。所以如果你打电话给obj,你实际上会得到三个;在实例化obj2之后再次。他们每个人都有自己的一个变量。希望对示例的这种修改是有意义的:

function outerFun()
{
    var a=0;
    function innerFun()
    {
        a++;
        alert(a);
    }
    return innerFun;  
}
var obj=outerFun();
obj();  //1
obj();  //2
var obj2=outerFun();
obj();  //3
obj();  //4
obj2();  //1
obj2();  //2
obj();  //5

有意义吗?

如果答案解决了你的问题,你可以。如果答案解决了你的问题,你可以。