对JavaScript闭包的工作原理感到困惑吗
我认为这是一个愚蠢的问题,但是考虑到这个JavaScript代码 函数outerFun { var a=0; 娱乐功能 { a++; 艾尔塔; } 回归内心的乐趣; } var obj=外部风; obj//1. obj//2. var obj2=outerFun; obj2//1. obj2//2.对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
我理解为什么在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
有意义吗?如果答案解决了你的问题,你可以。如果答案解决了你的问题,你可以。