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 :)

posted on 2012-04-16 16:59  nixil  阅读(245)  评论(0编辑  收藏  举报