日期:2014-05-16 浏览次数:20517 次
?
var foo = 1; function bar() { if (!foo) { var foo = 10; //如果这里不加var就是1了,加了var后在预编译时foo会被当做局部变量进行索引,可能有同学基
础和我一样不是太好的,在想我外部定义了一个变理,在内部使用都是好好的啊,那你一定要注意了,这里多了个var } alert(foo); } bar();
?
?
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