上几张图:
第一个:
声明了变量a,当预解析时,它的值为undefined,再声明了函数a,然后输出一下,发现a 输出为整个函数,
所以暂且认为函数声明会高级一点,
声明了a变量和a函数,弹出a的值为4,但是,调用时却为not a function,当你输出a的时候,他才赋值为4,覆盖了函数a,是声明顺序不同吗?变量声明优先级高于函数声明?
再看这个,换了个顺序,还是一样的,说明如果a变量赋值了话就会覆盖函数声明。
看看看,你不赋值他就很正常,所以就是因为赋值了,所以覆盖了函数a,
看看,一赋值就有问题,在此证明,赋的值会覆盖a函数
把输出放前面。预解析时,a是undefined,函数a为也保存了整个函数,那么为啥在前面输出为function,后面输出的a=7;
这个其实和前面的某一个一样,没什么问题
看了这些,我们应该分析一下了,js解释器进行解释的时候,会先预解析,分析一下最后一个,
预解析:
a:undefined
不执行
不执行
a:function(){ return 9}
当代码开始执行的时候:
a未赋值,还是undefined,
alert(a) 函数声明优先级高于变量声明的优先级。
alert(a());调用a函数,
可是为什么赋值了的变量却会覆盖函数呢?
有个博主说:同一个标识符的情况下,变量声明与函数声明都会提升;函数声明会覆盖变量声明,但不会覆盖变量赋值,即:如果声明变量的同时初始化或赋值那么变量优先级高于函数。
这句话解决了所有问题。
本文为转载文章,遵循 CC 4.0 BY-SA 版权协议