JavaScript Internals 101:提升变量和函数

时间:2012-11-26 13:47:21

标签: javascript hoisting

请考虑以下示例:

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中提升我的错误而其他人工作正常呢?

2 个答案:

答案 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中看到相同的行为。