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

Rya*_* Li 9 javascript

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

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

var f = function(m) {
    var g = function() {
        alert(m);
        var m = 0;
    };
    g();
};
f(1);
Run Code Online (Sandbox Code Playgroud)

这个代码将导致undefined,而不是1我期望的.

将该alert语句移到该var行下方将得出0有意义的答案.

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

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

var g = function(m) {
    alert(m);
    var m = 0;
};
g(1);
Run Code Online (Sandbox Code Playgroud)

会产生1.

谁能解释一下?谢谢.

dav*_*vin 8

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

这样,当g执行时,因为它会在某些点创建本地变量m,运行时已经声明了存在本地m(这显然隐藏的外部米f函数)类型undefined 从开头g的执行

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

变量的每个定义是一个真正的声明的变量其范围的顶部分配这里的定义是地方.