4.1 变量的类型
JS是非类型的
4.2 变量的声明
用var声明一个变量但没有声明时,值为undefined
如果不显式声明一个变量,JS将隐式声明它
重复声明:用var多次声明同一变量是合法的,且不会造成任何错误
隐式声明的变量总被创建为全局变量,即使该变量只在一个函数内使用。
4.3 变量的作用域
程序中定义这个变量的区域。
函数体内,局部变量的优先级比同名的全局变量高。
由于这种隐式的声明,为了避免混淆,在声明变量时都用var语句。
JS没有块级作用域(与C、C++、Java不同):
3层循环中i、j、k在Java中属于3个作用域,而在JS中属于一个作用域。
函数中声明的所有变量,无论在哪里声明的,在整个函数中他们都是有定义的。
var scope = "global";
function f()
{
alert(scope);
var scope = "local";
}
f();
4.4 基本类型和引用类型
基本类型:在内存中有固定大小,直接存储的就是数据的值。
引用类型:对象有任意的长度,没有固定大小,所以变量存储的是对这个值的引用,通常引用的形式是指针或内存地址(到哪里找到这个值)。
4.5 垃圾收集
与C、C++不同,JS程序员不用手动释放已分配的资源,这点和Java一样。
4.6 作为属性的变量
JS中变量基本上和对象的属性是一样的。
全局对象:在JS解释器开始运行时,首先要做的事情之一就是在执行任何JS代码前,创建一个全局对象,这个对象的属性就是JS程序的全局变量,
当声明一个JS全局变量时,实际上所做的是定义了那个全局对象的一个属性。在客户端JS中,Window对象代表浏览器窗口,它是包含在
该窗口中的所有JS代码的全局对象。
局部变量:调用对象
JS执行环境:JS解释器每次开始执行一个函数时,都会为那个函数创建一个执行环境,而且具有自己的调用对象,在调用对象中定义了局部变量。所以,运行不属于任何 函数的JS代码的环境就是全局对象。而且,一个JS解释器可以在不同的全局执行环境中运行脚本,而且这些环境之间并不是完全脱节的,他们彼此可以互相引用。全局变量时特殊的全局对象的属性,局部变量也是一个对象的属性,这个对象被称为调用对象(就是这个函数)。在执行一个函数时,函数的参数和局部变量是作为调用对象的属性而存储的。
4.7 深入理解变量作用域
每个JS执行环境都有一个和它关联在一起的作用域链,是一个对象列表或对象链。在JS顶层代码中,作用域链只有一个对象构成,就是全局对象。
在一个非嵌套的函数中,作用域链由两个对象构成,第一个是函数的调用对象,第二个是全局对象,以此类推。