在嵌套函数中使用var来声明一个与parent参数同名的变量

时间:2011-04-05 08:44:10

标签: javascript

我正在使用JavaScript编写一些代码并发现了意外行为。

我在g内使用嵌套函数ff有一个名为m的参数。当在g内使用和声明一个具有相同名称的变量时,会发生一些奇怪的事情:

var f = function(m) {
    var g = function() {
        alert(m);
        var m = 0;
    };
    g();
};
f(1);

此代码将生成undefined,而不是我期望的1

alert语句移到var行下面会得到答案0,这是有道理的。

我想这是因为JavaScript只使用函数作为名称闭包,var m将使用声明附加到函数g,但是m尚未分配alert

但我不确定这一点,因为如果函数没有嵌套,那么行为对我来说很好看:

var g = function(m) {
    alert(m);
    var m = 0;
};
g(1);

会产生1

有人可以解释一下吗?谢谢。

1 个答案:

答案 0 :(得分:8)

Javascript使用函数范围,这意味着变量的范围不像C的块范围根据{}进入和超出范围,而是对象进入和超出范围的函数的开头和结尾。因此,您在函数中定义的每个局部变量都是从该函数执行开始时声明的,并且在您在函数中初始化之前将为undefined类型。

因此,当g执行时,由于它将在某个时刻创建局部变量m,运行时已经声明存在本地m(显然隐藏了外部f执行} 的undefined g函数的m

请参阅https://developer.mozilla.org/en/JavaScript/Reference/Scope_Cheatsheet,其中解释了当您执行var varName时,它将变量提升到函数范围的顶部。那个页面有很多很好的例子,这里有一个总结它的引用:

  

变量的每个定义实际上是其范围顶部的变量的声明赋值定义的地方。