在javascript中静态或动态地“变换”变量?

时间:2009-06-06 04:16:18

标签: javascript scoping

或者更具体到我需要的东西:

如果我从另一个函数中调用一个函数,它是从调用函数中还是从上面的级别中提取变量?例如:

myVar=0;

function runMe(){
    myVar = 10;
    callMe();
}

function callMe(){
   addMe = myVar+10;
}

如果通过runMe()调用callMe(),myVar最终会是什么?

7 个答案:

答案 0 :(得分:46)

杰夫是对的。请注意,这实际上不是静态作用域的一个很好的测试(JS确实有)。更好的是:

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。