为了账号安全,请及时绑定邮箱和手机立即绑定

这题输出为什么是ƒ a(){} 和 2啊 ?

这题输出为什么是ƒ a(){} 和 2啊 ?

再睡一会就码 2019-09-27 21:27:02
  function fn(a){       console.log(a);       var a=2;       function a(){}       console.log(a);   }   fn(1)
查看完整描述

2 回答

?
pardon110

TA贡献1038条经验 获得超227个赞

涉及到js的变量提升和词法分析,变量解析的优先顺序如下

  1. js语言定义变量  像this,arguments这类变量名

  2. 形参变量 形参变量会添加到函数的作用域中

  3. 函数声明 表现出现的就是函数体

  4. 变量声明 

词法分析顺序:参数-->变量声明 --> 函数说明

js函数在运行期会生成一个活动对象,先进行变量提升,再做词法分析,换句话来说就是变量覆盖

当代码运行到第1个console.log时a已发生过赋值操作,因此词法分析此时的参数 a是活动对象AO已存在a属性且值为 1,与此同时受函数fn内的 a也存在变量提升,它的默认值 是undefined,对提升的普通变量在Ao上已存在,则不作任何操作, 但碰到后面的函数变量a也提升了,它的默认值为该函数体,根据词法分析顺序,此时a输出时变量会被同名的Ao属性a覆盖结果输出函数体,到第2个console时进入时,因变量提升已分析完,直接进入了词法分析(进入作域首先做的就是变量提升),之上明确声明 a值 且赋值就是2,它在函数a变量提升之后,导致覆盖直接输出变量2.

需要注意的是在词法分析阶段,针对AO对象上的已存在的属性变量,其在词法分析变量阶段不作任何操作。但若存在函数变量提升,则会被赋盖。

另外一个要注意的是,js虽然大体上是从上到下的执行,但在引擎解析这部分会有其它的小动作,毕竟最终执行者还是引擎,引擎想更改执行顺序太容易了。

查看完整回答
反对 回复 2019-09-29
  • 2 回答
  • 0 关注
  • 732 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信