函数声明以及它们如何在当前作用域中创建变量

时间:2018-11-11 01:31:58

标签: javascript

我正在阅读有关js函数的这篇文章。 https://dmitripavlutin.com/6-ways-to-declare-javascript-functions/

它说:“函数声明在当前范围内创建一个变量,其标识符等于函数名称。该变量保存函数对象。”

所以我做了一些实验以了解更多信息。

function a () {
    return 1;
}
console.log(typeof a === "function")
console.log(typeof a === "number")

此输出
是的
错误

这并不奇怪,然后当我运行它时。

var a = 1;
function a () {
    return 1;
}
console.log(typeof a === "function")
console.log(typeof a === "number")

输出为
错误

因此,尽管将a分配给一个数字,然后再分配给一个函数,但最后还是一个数字。

是否存在某种规则说变量声明会覆盖函数声明,或者还有更多规则?

1 个答案:

答案 0 :(得分:2)

函数声明被提升到其包含函数(或最外面的块)的顶部。您的下部代码等效于以下代码:

var a = function a () {
    return 1;
}
// next line reassigns `a` to number:
a = 1;
console.log(typeof a === "function")
console.log(typeof a === "number")

如果您在行a之前登录a = 1,则会在重新分配它之前看到它确实是一个函数:

console.log(typeof a);
var a = 1;
console.log(typeof a);
function a () {
    return 1;
}