1

考虑以下示例:

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在其他人工作正常的情况下提升给我错误呢?

4

2 回答 2

3

让我们重写您的f3函数以显示变量提升后的样子:

function f3() {
    log(company());
    var company = function() { return 'RIM'; };
}

变成:

function f3() {
    var company; // declaration hoisted

    log(company());
    company = function() { return 'RIM'; };
}

现在您可以看到您正在尝试执行未定义的变量,而不是函数(因此出现“不是函数”错误)。

请注意,这与 的输出不同,f2因为函数声明是作为一个单元提升的。

于 2012-11-26T13:59:03.610 回答
1

变量被提升,但设置它不是。

在调用after 之前,不会设置companyin的值。您可以在 中看到相同的行为。f3log(company())f1

于 2012-11-26T13:57:08.213 回答