JavaScript范围在这里发生了什么?

时间:2013-05-11 17:24:18

标签: javascript scope

我写了以下代码片段:

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

function foo() {
    f();

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

foo();

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

2 个答案:

答案 0 :(得分:14)

这是关于提升http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.htmlhttp://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();

答案 1 :(得分:0)

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