8

我编写了以下代码片段:

var f = function() { document.write("a"); };

function foo() {
    f();

    var f = function() { document.write("b"); };
}

foo();

我希望调用打印的函数a,但它却给出了关于调用undefined值的运行时错误。为什么会这样?

4

2 回答 2

14

这是关于变量提升http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html , http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-javascript-hoisting-explained/

您的代码与下一个代码等效;

var f = function() { document.write("a"); };
function foo() {
    //all var statements are analyzed when we enter the function
    var f;
    //at this step of execution f is undefined;
    f();
    f = function() { document.write("b"); };
}
foo();
于 2013-05-11T17:28:31.543 回答
0

由于(就像在 java 中一样)您不必担心在文件中定义事物的顺序,因此会发生某种情况。当您重新定义变量 f 时,它会清除 f 的另一个版本,但直到之后才定义它,因此当 f 被调用时,您会收到错误。

于 2013-05-11T17:32:40.250 回答