1
$(function() {
    foo1("text");
    foo2("text");
}) 

function callback(func) {
    func();
}

function foo1(bar) {
    callback(function() {
        console.log(bar);       // "text"
        bar = "derp";
        console.log(bar);       // "derp"
    })
}

function foo2(bar) {
    callback(function() {
        console.log(bar);       // undefined
        var bar = "derp";
        console.log(bar);       // "derp"
    })
}

为什么 var bar = "derp" 的声明未定义预先访问的参数?

4

1 回答 1

2

因为这段代码

function foo2(bar) {
    callback(function() {    
       console.log(bar);       // undefined
       var bar = "derp";
       console.log(bar);       // "derp"
    })
}

实际上是

function foo2(bar) {
    callback(function() {  
       var bar;
       console.log(bar);       // undefined
       bar = "derp";
       console.log(bar);       // "derp"
    })
}

由于可变提升。因此,即使您在调用bar内部创建了一个全局变量,也会在函数的内部范围内声明foo1一个作用域变量。这就是为什么第一个返回barfoo2console.logundefined

另请参阅SO 上的变量提升

于 2015-04-22T08:31:31.767 回答