或者更具体到我需要的东西:
如果我从另一个函数中调用一个函数,它是从调用函数中还是从上面的级别中提取变量?例如:
myVar=0;
function runMe(){
myVar = 10;
callMe();
}
function callMe(){
addMe = myVar+10;
}
如果通过runMe()调用callMe(),myVar最终会是什么?
答案 0 :(得分:46)
myVar=0;
function runMe(){
var myVar = 10;
callMe();
}
function callMe(){
addMe = myVar+10;
}
runMe();
alert(addMe);
alert(myVar);
在静态范围的语言(如JS)中,警告10和0. runMe中的var myVar(局部变量)会影响该函数中的全局myVar。但是,它在callMe中没有任何效果,因此callMe使用仍为0的全局myVar。
在动态范围的语言(与 JS不同)中,callMe将从runMe继承范围,因此addMe将变为20.请注意,myVar在警报时仍为0,因为警报不会继承两种功能的范围。
答案 1 :(得分:4)
如果您的下一行 callMe(); ,则addMe将为10,myVar将为0.
如果您的下一行 runMe(); ,则addMe将为20,myVar将为10.
请原谅我 - 这与静态/动态绑定有什么关系?不是myVar只是一个全局变量,并且程序代码(将所有内容解包到调用堆栈中)不会确定值吗?
答案 2 :(得分:3)
变量在JavaScript中是静态范围的(动态范围确实是一个非常混乱的业务:您可以在Wikipedia上阅读更多相关内容。)
在您的情况下,您使用的是全局变量,因此所有函数都将访问同一个变量。 Matthew Flaschen的回复显示了你如何改变它,所以第二个myVar实际上是一个不同的变量。
This Page解释了如何在JavaScript中声明全局变量和局部变量,以防您不熟悉它。它与大多数脚本语言的做法不同。 (总结:如果在函数内声明,“var”关键字使变量成为局部变量,否则变量是全局变量。)
答案 3 :(得分:1)
除非您使用关键字var
来定义变量,否则一切都最终成为window
对象上的属性。所以你的代码将等同于以下内容:
window.myVar=0;
function runMe(){
window.myVar = 10;
window.callMe();
}
function callMe(){
window.addMe = window.myVar+10;
}
如果你记住这一点,应该始终清楚发生了什么。
答案 4 :(得分:0)
据我所知,没有 var 关键字的任何变量都被视为 global ,使用它,本地作用域,所以:
// This is a local scoped variable.
var local_var = "something";
// This is a global scoped variable.
global_var = "something_else";
作为一个很好的JS实践,建议总是添加 var 关键字。
答案 5 :(得分:0)
我想补充一点,lambda表达式也是静态作用于定义表达式的位置。例如,
var myVar = 0;
function foo() {
var myVar = 10;
return { bar: function() { addMe = myVar + 10; }}
}
var myObj = foo();
var addMe = 6;
alert(addMe);
myVar = 42;
myObj.bar();
alert(addMe);
这将显示6和20。
答案 6 :(得分:0)
myVar=0;
function runMe(){
myVar = 10;
callMe();
}
function callMe(){
addMe = myVar+10;
}
就输出而言,myVar和addMe在这种情况下都是全局变量,如javascript,如果你没有用var声明变量那么它隐式地将它声明为全局,因此当你调用runMe()时myVar的值为10,addMe的值为20。