Jun*_*Zhu 0 javascript closures function
在比较正常函数和立即函数时,我对范围感到困惑.这是一个例子:
var num=5;
var x=3;
doubleNum = function(){
num = num*x
x++;
return num;
};
console.log(doubleNum());//15
console.log(doubleNum());//60
console.log(doubleNum());//300
Run Code Online (Sandbox Code Playgroud)
这是一个普通函数,num和x是全局定义的,可由doubleNum访问,因此更新了num和x.
var num=5;
var x=3;
doubleNum = function(){
num = num*x
x++;
return num;
}();
console.log(doubleNum);//15
console.log(doubleNum);//15
console.log(doubleNum);//15
Run Code Online (Sandbox Code Playgroud)
但是,如果我定义一个立即函数并以同样的方式调用它,我得到了不同的答案.即使我希望有相同的输出我错过了必要的东西吗?或者我理解了一些错误的概念?请帮忙.提前致谢. 的jsfiddle
因为您doubleNum不是对函数的引用,而是保留匿名函数调用的结果.
在第一种情况下,您分配给doubleNum一个函数,每次调用它时doubleNum(),您可以更改其中的超出范围的变量并返回一个num.你做这个3时间.你的代码相当于喜欢的东西
var num=5;
var x=3;
doubleNum = function(){
num = num*x; // Every call will affect the outscoped num
x++; // Every call will affect the outscoped x
return num;
};
var val = doubleNum(); // Call changes the values and returs a new result
console.log(val);
val = doubleNum(); // Call changes the values and returs a new result
console.log(val);
val = doubleNum(); // Call changes the values and returs a new result
console.log(val);Run Code Online (Sandbox Code Playgroud)
在第二种情况下,您将分配单个调用匿名函数doubleNum的结果.函数值已经计算过一次,并将结果赋值给.你的代码与之相当doubleNum
var num=5;
var x=3;
var doubleNum;
var myFunction = function(){
num = num*x;
x++;
return num;
};
doubleNum = myFunction(); // Only one call
console.log(doubleNum);
console.log(doubleNum);
console.log(doubleNum);Run Code Online (Sandbox Code Playgroud)