为什么在回调中声明一个 var 会取消定义参数? (吊装)

Why does declaring a var inside a callback undefine the parameter? (Hoisting)

$(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" 的声明取消了预先访问的参数的定义?

因为这段代码

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"
    })
}

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

另见 Variable hoisting SO