1.javascript的变量是无类型的(untype)。
2.用var声明的变量是永久性的。所以当你试图用delete来删除其声明的变量时会报错。
3.当试图读取一个未声明的变量时,会报错。
4.当给一个未用var声明的变量赋值时,js会隐式的声明该变量(这个变量会被声明为全局变量,所以最好用var来声明。这一点在局部声明时非常重要)。
5.在函数内部,局部变量的优先级要高于同名的全局变量(相当于隐藏了该同名的全局变量)。
结合4,5两点。我们给出一个列子来说明其重要性。
var part = "global"; //声明一个全局变量
function checkpart()
{
var part = "local"; //声明一个局部变量
document.write(part);
}
checkpart(); //输出local
document.write(part); // 输出global
当你在声明part局部变量时省略了var。这就相当于声明了一个全局变量,即改变了全局变量part的值。下面的两条语句输出的都是local。
6.没有块级作用域。函数中声明所有变量(无论在哪里声明的),在整个函数中他都是有定义的。
var part = "global";
function checkvariable()
{
document.write(part);
}
checkvariable(); //输出global
var part = "global";
function checkvariable()
{
documen.write(part);
var part = "local";
document.write(part);
}
checkvariable();
上述代码第一次输出的不是global,而是undefined。这告诉我们在函数中声明变量时尽量将其集中放在函数的开头。
7.变量的内容
js中数据类型分为两组:基本数据类型和引用类型。数值,布尔值,null和未定义的值属于基本类型。对象,数组,函数属于引用类型(函数也是一种数据类型)。(字符串属于特殊类型)。基本数据类型在内存中具有固定的大小:一个数值占8个字节(在基本类型中最大),一个布尔值占一位。而引用类型具有任意长度,没有固定的大小。无法将其直接与每个相关变量储存在8个字节的内存中。所以变量储存的是这个值的引用(通常引用有两种形式:指针和内存地址)。这两中数据类型具有很大的差别。
var i = 1;
var j = i;
i = 2;
alert(j); //输出1
var i = new Array(1,2,3);
j = i;
i[0] = 2;
alert(j); //输出2,2,3
8.作为属性的变量
js解释器在工作之前会在所有js代码运行之前创建一个全局对象。这个全局对象的属性就是所有的全局变量。同理也会存在一个调用对象。而这个调用对象的属性就是所有的局部变量。一个js解释器可以工作在不同的执行环境中。这些执行环境彼此独立且又相互联系。(执行环境:不同的窗口,框架)。