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

关于js解析执行有趣的事

前些天总监在群里发了两段代码:

?

var foo = 1;  
function bar() {  
    if (!foo) {  
        var foo = 10;  
    }  
    alert(foo);  
}  
bar();  

?

?

?

var a = 1;  
function b() {  
    a = 10;  
    return;  
    function a() {}  
}  
b();  
alert(a);  

?

?

不测试,大家看输出的是什么?

1 楼 rimoer 2012-06-18  
试了,谁知道,来解释下...
2 楼 liukemin 2012-06-18  
rimoer 写道
试了,谁知道,来解释下...

http://liukemin.iteye.com/blog/1562948 看这篇文章
3 楼 hwhoho2010 10 小时前  
这个很有意思啊,呵呵 除了预编译,还有闭包的概念在里面

对于第一个例子,在预编译bar期间,由于foo还是undefined的,所以执行了var foo = 10;这句话,而var foo就变成了函数bar的局部变量,之前定义的foo是全局变量。所以你在执行bar()时,打印的是局部变量foo(即 foo=10)而不是全局变量foo = 1
对于第二个例子,意思差不多,不过这次不但改变了a为局部变量,而且连a的类型也改了