js中变量重复声明

测试题

先做道题:

1
2
3
4
5
(function(num) {
console.log(num);
var num = 10;
function num() {}
})();

知道 js 的变量声明和方法声明提升特性的同学应该都知道,输出肯定不会是 10.
《你不知道的 javascript(上)》中说到:

1
2
函数优先:
函数声明和变量声明都会提升,但值得注意的一个细节是,函数会优先被提升,然后才是变量。

从上得知,那输出结果就是undefine,是不是被自己的英明神武所折服了,哈哈,那你就错了,结果应该是function(){}

疑问

既然方法优先被提升,那不应该被后面的变量给覆盖吗?
你可以试下下面的 demo

1
2
3
var num = 10;
var num;
console.log(num);

结果是 10,不是 undefined;

《JavaScript 高级程序设计》第 7.3 章节又说了:

JavaScript 从来不会告诉你是否多次声明了同一个变量;遇到这种情况,它只会对后续的声明视而不见(不过,它会执行后续声明中的变量初始化)。

总结

这就解释了第一道题的答案了,既然 num 已经是 function,但后面变量提升,提升并没有初始化,所以被忽略。(提升只是提升声明,初始化不提升)

文章作者: wenmu
文章链接: http://blog.wangpengpeng.site/2020/02/28/js%E4%B8%AD%E5%8F%98%E9%87%8F%E9%87%8D%E5%A4%8D%E5%A3%B0%E6%98%8E/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 温木的博客
微信打赏