javascript - 函数声明以及它们如何在当前范围内创建变量

标签 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分配给了一个数字,然后又分配给了一个函数,但最后还是一个数字。

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

最佳答案

函数声明被提升到它们包含的函数的顶部(或最外层的 block )。您的较低代码等效于以下内容:

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 = 1 行之前记录 a,您会发现它在被重新分配之前确实是一个函数:

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

关于javascript - 函数声明以及它们如何在当前范围内创建变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53245082/

相关文章:

javascript - 如果 HTML5 不可用,SoundManager2 能否使用 Flash 作为相同声音的备份?

javascript - 如果不存在则定义全局

javascript - 使用纯 JavaScript 隐藏显示具有给定类名的表行

javascript - 获取正在翻译的元素的位置

php - Javascript 函数未定义

javascript - range - 如何自动选择新插入的节点?

javascript - 从 JSON 解析数组,其中每个字段键都是一个数字

javascript - 如何为 LIstView 中的每一行添加一个按钮?

JavaScript 表单验证第二个 if 语句不起作用

javascript - 如果选中复选框,则更改类 bg