为什么在回调中声明一个 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
$(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