function fn(a){ console.log(a); var a=2; function a(){} console.log(a); } fn(1)
2 回答
pardon110
TA贡献1038条经验 获得超227个赞
涉及到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虽然大体上是从上到下的执行,但在引擎解析这部分会有其它的小动作,毕竟最终执行者还是引擎,引擎想更改执行顺序太容易了。
添加回答
举报
0/150
提交
取消