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

你可能感兴趣的:(JavaScript)