<script>
var i = 10;
function a(){
alert(i);
}
//a();//output:10
</script>
<script>
var i = 10;
function a(){
var i = 2;//在alert上可以输出2
alert(i);
//var i = 2;//在alert下因为未赋值所以输出undefined:不明确的变量
}
a();//output:undefined
<pre name="code" class="javascript"> </script>
第一个script里面可以输出10,在变量解析过程中首先查找局部的作用域,然后查找上层作用域。在代码一的函数当中没有定义变量i,于是查找上层作用域(全局作用域),进而进行输出其值。但是在代码二的函数内定义了变量i(无论是在alter之后还是之前定义变量,都认为在此作用域拥有变量i),于是不再向上层的作用域进行查找,直接输出i。但是不幸的是此时的局部变量i并没有赋值,所以输出的是undefined。
《JavaScript权威指南》中提出的“没有块级作用域”实际上就是上述的意思。