js预编译和执行期的问题
?
var a = 1; function b() { a = 10; return; function a() {} //同理a在这里被重新索引} b(); alert(a);?
下面引用某位同学的回答,个人觉得讲的很清楚了:
预编译和执行期的问题。javascript会分块的进行预编译,预编译期会处理所以使用var声明的变量以及使用function的函数会被处理,但var声明的变量只进行索引,而不处理赋值,赋值在执行期处理,而function的函数会处理函数体。
所以第一个例子:预编译期间建立索引foo和处理bar函数体,但foo未赋值,所以foo为undefined。然后执行期给foo赋值1,执行bar()时,先预编译函数体内的内容,建立局部变量索引foo,但未赋值,所以foo=undefined,此时执行期bar(),由上往下执行,结果自然为10.
而第二个例子类似,因为执行期到b()时,会预编译b里面的内容,此时function a(){}相当于(类似)var a,即也建立局部变量的索引a,所以执行期给局部变量的a赋值10,并不影响全局的a