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

  function fn(a){

       console.log(a);

       var a=2;

       function a(){}

       console.log(a);

   }


   fn(1)


再睡一会就码
浏览 684回答 2
2回答

pardon110

涉及到js的变量提升和词法分析,变量解析的优先顺序如下js语言定义变量  像this,arguments这类变量名形参变量 形参变量会添加到函数的作用域中函数声明 表现出现的就是函数体变量声明 词法分析顺序:参数-->变量声明 --> 函数说明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虽然大体上是从上到下的执行,但在引擎解析这部分会有其它的小动作,毕竟最终执行者还是引擎,引擎想更改执行顺序太容易了。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript