var a = 8;
function a(){};
console.log(a);
为啥a不是function 而是8呢?
你需要了解2个概念:
javascript
具备"头等函数(first-class function)"的特性,优先声明并且不会被后面的声明覆盖(注意这里只是说声明不会被覆盖)因此你的代码在被引擎解析之后如下:
function a(){}// 此时a被声明切赋值为函数
var a;// 此时的a依然是函数,因为函数是头等公民
a = 8;// 此时赋值,覆盖原来的函数
console.log(a);// 输出a的值,也就是8
10 回答11.2k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
问题很好,题主看起来也有过思考。
这个问题涉及两个点,变量提升和函数声明。
1.变量提升
js
中的变量提升,提的是声明。因此变量a
只有声明被提升了,初始化依然处于原位置。而函数a
则整体都提升了。2.函数声明
对于
function a(){}
,实际上分成了两部分,一是声明一个name
为a
的函数,二是将这个函数赋给变量a
。因此这段代码的运行过程是这样的
1.声明函数
a
,根据上文,实际是var a = function (){}
(函数名为a
)。这里已经声明了变量a
并初始化2.声明变量
a
,由于之前已经声明了a
,因此这里会跳过声明。相当于变量a
的变量提升没用了。3.执行变量
a
的初始化,由于之前的声明,这里实际上等同于变量a
的赋值因此最后打印的a为8