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

JavaScript的作用域(学习笔记二)

看看下面代码的执行结果:

?

<script>
	alert(a);
	a = "hello";

	alert(b);
	var b = "hello";
</script>

?答案如下:

?

  1. ?alert(a)执行时报脚本错误:“a”未定义
  2. ?alert(b)打印出:undefined

让我们来分析一下。

1、首先从alert(b)开始分析。本着JavaScript“先定义,后赋值”的原则,代码片段(1)

?

alert(b);
var b = "hello";

?在编译的时候,其实是按照下面的方式进行编译的:

?

var b;
alert(b);
b = "hello";

?JavaScript在编译的时候,凡是遇到var关键字的,都会在变量所处作用域内的最顶端先声明这个变量。这样,就很好理解为什么alert(b)的时候是undefined了。

?

2、接着在分析alert(a)。大家都知道,在JavaScript中,如果直接给一个从未声明过的变量赋值,那么,这个变量就会默认为是全局变量。既然是全局变量,为什么alert(a)的时候,会有错误?应该和alert(b)一样,打印出undefined啊?其实不然。因为 a = “hello”,前面没有var关键字,所以,在编译的时候,js编译器不认为这条语句有什么特殊性,就是一条普通的语句。说到这里,大家会明白,只有执行到 a = "hello"这一行时,js才会声明一个变量a,并给变量a赋值,在这之前,根本就没有a这个变量,先前的alert(a)肯定会报错的。

?

?