变量传值、作用域
变量传值
基本数据类型:
Undefined、Null、Boolean、Number、String 五种。
引用类型: Array、Object、Function、Date、RegExp、基本包装类型(Boolean、Number、String )。
给变量赋值时,基本数据类型的值会采用专递数值的方式。例如:
var a = 10;
var b = a;
此时,b获得a的值,并建立副本,二者数据相互独立。
如果,变量传递引用类型时,传递的不是引用的内容,而是地址(指针)。例如:
var a = [1, 2, 3];
var b = a;
b.push(4);
alert(a); //"1,2,3,4",alert取toString()值,a的值为[1, 2, 3,4]
alert(b); //"1,2,3,4"
此时,a、b的值本质为引用的相同的地址,当地址内容改变,a、b同时改变。
这种现象同样适用于函数传参。例如:
var a = [1,2,3];
var b = 10;
function add(a,b){
a.push(4);
b++;
}
add(a,b);
alert(b); //10
alert(a); //[1,2,3,4]
作用域
JavaScript没用块级作用域。JS中依靠执行环境定义变量或函数的访问范围,作用域链等知识请自行查看w3
c标准。
JS中,var声明的变量会自动添加到接近的环境中,如果在函数中没用var声明,该变量会被直接添加到全局环境。
局部环境下查询标识符时,按照作用域链自下而上的查询,知道找到第一个标识符声明(var),若找不到,返回undefined。注意,未使用var声明的变量,在函数执行环境中改变时,不作为查询标识符,一定要查询到var声明处。
函数传递与全局变量同名参数时,相当于在给参数var声明。因此,函数中可以查寻到。
var a = 1;
function add(a){
a++;
}
add();
alert(a); //1