变量一:深入了解声明与赋值
说明1:什么叫声明:有var才叫声明,无var只能叫赋值
说明2:什么叫未声明变量:指在当前作用域,及上层作用域,直至全局window作用域均未用var声明过的变量
规则1:var声明提前规则:所有的var声明会自动提前到当前作用域的前面,优先执行
规则2:var声明预赋值规则:声明时其实会将undefined(记住:无引号)先赋值给变量,作用相当于占位符
规则3:var声明一次(且必须)规则:
A: 在相同的作用域中多次声明同一变量,只第一次声明有效,不同的作用域中声明同一个变量,会认为是不同的变量(这在作用域中再讲)
B : 如果给未用var声明的变量赋值,js会自动在全局window作用域中先声明变量。其实上面也可能理解为,只有var声明过的变量,才能赋值(给未声明过的变量赋值,其实会先在全局中自动声明这个变量,这个过程是js自动完成的)
C: 调用未声明过的变量会报错
函数中形参与变量之间的关系
function wang(arg1,arg2,arg3){
...
}
调用时传入实参
wang('sex','name','old');
相当于
function wang(arg1,arg2,arg3){
//第一步,先将形参按规则2全部预赋值,按规则1全部提前
var arg1=undefined;//注意:无引号
var arg2=undefined;
var arg3=undefined;
//第二步:获取实参的值
arguments[0]='sex';
arguments[1]='name';
arguments[2]='year';
//第三步:赋值,将实参的值赋值给形参
arg1=arguments[0];//说明:它们之间是引用传递的,两者一直是绝对相等的,即使它们重新赋值
arg2=arguments[1];
arg3=arguments[2];
说明:从上面很清楚,如果实参的数量大于形参,忽略,如果少于形参,那么值为undefined,所以如果想给函数设默认值,就判断这个值是否为undefined就行
这三步是自动完成的,比函数内其它语句先执行,明白这个道理,函数内很多奇怪的用法就会明了
...
}
例一:
function test(x,y){
var x = 10;
alert(arguments[0],arguments[1]);
}
test();
按上面的思路分解下
function test(x,y){
var x=undefined,y=undefined;
//无实参,所以不存在argments[],当然更谈不上给形参赋值
x = 10;//规则3,只声明一次,多余的声明忽略,
alert(arguments[0],arguments[1]);//弹出undefined,因为这个变量根本就不存在啊
}
test();
补充一下:
五种基本类型【Number,Null,Undefined,Boolean和String】是按值访问,象数组,对象是按引用访问
var a=b={};
a.name='前进';
alert(b.name);//返回'前进'
var c=d=e=['刘德华','张学友'];
c.push('黎明');
c.push('郭富城');
console.log(e);//返回["刘德华", "张学友", "黎明", "郭富城"]