变量是一个和数值相关的名字。简单的说变量里“包含”或“存储”一个值。
变量的类型
变量是没有数据类型的,你可以给一个变量先赋值数值,在赋值成字符串这个是合法的。
var i = 1; i = 'asd';
变量的声明
定义javascript变量名使用var关键字,
var a;
或者可以直接定义并初始化值
var a = 1;
如果定义了一个变量,没有初始化值,那在给这个变量赋值之前该变量的值是undefined。如果读一个没有声明的变量,这个是报错的,但是要是给这个变量名赋值那么这个变量名就合法了,它会变成一个全局变量。
变量的作用域
一个变量的作用域是程序中定义这个变量的区域。全局(global)变量的作用域的全局的,它在javascript代码中处处都可以定义。局部(local)变量,它只能在函数体内定义,包括函数的参数也是局部变量。
局部变量的优先级是高于全局变量的。
var i = "global"; function test(){ var i = "local"; document.write(i);//local }
javascript是没有块级别的作用域的,只要是在这个函数体内定义的变量,不管是在声明语句块里还是在语句块定义,该函数体内都是可以使用的。对于变量的定义尽量定义在函数的开头。
i = "global"; function test(){ alert(i);//undefinded 由于局部变量定义和全局变量相同的变量名,所以全局变量被隐藏了, //但是局部变量还没有初始化,所以是 undefinded var i = "local"; if (1 > 0){ var a = "1234"; } alert(i);//local alert(a);//1234 } test();
基本类型和引用类型
数值、布尔值、null、undefined属于基本类型,对象、数组、函数属于引用类型。基本类型在内存中具有固定大小的,而引用类型是没有固定大小的。
var a = 3.14 var b = a; a = 4; alert(b);//3.14 var c = [1, 2, 3]; var d = c; c[0] = 99; alert(d);//[99, 2, 3] var s = '123'; var s1 = s; s = '456'; alert(s1);//123
字符串是一个特殊的类型,它可以看做是基本类型,是因为他是通过复制来传递的。也可以看做是引用类型,因为它的大小也是可变的。
垃圾回收
javascript程序在创建字符串、数组、对象时,解释器必须动态分配内存来存储它们,这样很容易造成内存溢出。因此javascript产生了垃圾回收机制,它是自动检测引用对象是否还是被变量引用,如果检测出该对象没有被变量引用,将自动清除对象(也就是清除对象所占用的内存)
var a = "123"; var b = "456"; a = b; document.write(a);//456
这时再也无法找到a原来的123,所以可以理解为被javascript回收了。
作为属性的变量
当javascript的解释器开始运行的时候,他首先创建一个全局对象,对象的属性就是全局变量。但是javascript允许有多个全局执行环境,也就是说每一个环境都有不同的全局的对象(在这种情况下,全局对象就不在是全局的了)。但是每一个全局的对象都会有javascript预设定的属性和对应的自己定义的属性。例如
<html> <head> <title></title> </head> <body> <iframe src="1_1.html"></iframe> <script> var a = 1; </script> </body> </html>
1_1.htnl
<html> <head> <title></title> </head> <body> <input type="button" value="click" onclick="test();"> <script> function test(){ var i = parent.a; alert(i);//1 } </script> </body> </html>
父页面的script代码块和子页面1_1.hml是没有关系的,它们有各自的全局对象和属性,但是子页面可以使用parent.X到父页面的全局对象的属性。