请考虑以下示例:
var company = 'Apple',
log = console.log;
function f1() {
log(company);
var company = 'Twilio';
log(company)
}
function f2() {
log(company());
function company() {
return 'Zynga';
}
}
function f3() {
log(company());
var company = function() { return 'RIM'; };
}
log(company);
log('---');
f1();
log('---');
f2();
log('---');
f3();
萤火虫的输出是:
"Apple"
---
undefined
"Twilio"
---
"Zynga"
---
TypeError: company is not a function
那么,为什么在f3
中提升我的错误而其他人工作正常呢?
答案 0 :(得分:3)
让我们重写你的f3
函数,以显示变量提升后的样子:
function f3() {
log(company());
var company = function() { return 'RIM'; };
}
变为:
function f3() {
var company; // declaration hoisted
log(company());
company = function() { return 'RIM'; };
}
现在您可以看到您正在尝试执行未定义的变量,而不是函数(因此“非函数”错误)。
请注意,这与f2
的输出不同,因为函数声明作为一个单元被提升。
答案 1 :(得分:1)
变量已挂起,但设置不是。
company
中的f3
的值在调用log(company())
之后才会设置。您可以在f1
中看到相同的行为。