JavaScript Puzzle 之 变量作用域
var a = 10; (function(){ alert(a); var a = 20; })();
请看上面这段代码, 猜测一下alert出来的是什么呢? 答案可能出乎意料是undefined! 当然如果你弄清除了js的作用域和变量解析机制, 也就能够理解了. 大家都知道js是解释执行的, 但并不是简单的按顺序一行行执行, 而是以块(block)为单位, 边解析边执行. 那么在解析这个块的时候, 会将变量声明操作提到块的最前面. 所以上面的代码其实是等同于
var a = 10; (function(){ var a; alert(a); a = 20; })();
这样一来也就十分明了了, 由于闭包的机制, 首先找到的是function内部的a, 而此变量在alert时自然是undefined.
最后再比较一下下面这段代码
var a = 10; (function(){ alert(a); a = 20; })();
这次将会弹出10 :)