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

kyl*_*lex 31 javascript scoping

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

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

myVar=0;

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

function callMe(){
   addMe = myVar+10;
}
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*hen 49

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

myVar=0;

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

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

runMe();
alert(addMe);
alert(myVar);
Run Code Online (Sandbox Code Playgroud)

在静态范围的语言(如JS)中,警告10和0. runMe中的var myVar(局部变量)会影响该函数中的全局myVar.但是,它在callMe中没有任何效果,因此callMe使用仍为0的全局myVar.

在动态范围的语言中( JS 不同),callMe将从runMe继承范围,因此addMe将变为20.请注意,myVar在警报时仍为0,因为警报不会从任一函数继承范围.

  • 例外情况是'this'关键字,其行为类似于动态范围的变量 (13认同)

Jef*_*ang 5

如果您的下一行是callMe(); ,则addMe将为10,而myVar将为0。

如果您的下一行是runMe(); ,则addMe将为20,而myVar将为10。

请原谅我问-这与静态/动态绑定有什么关系?myVar不仅是一个全局变量,而且程序代码(将所有内容都包装到调用堆栈中)不会确定这些值吗?