日期:2014-05-16  浏览次数:20508 次

js预编译和执行期的问题

?

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