变量一:深入了解声明与赋值

说明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);//返回["刘德华""张学友""黎明""郭富城"]

 

 

posted @ 2013-02-04 19:36  北京大奇  阅读(139)  评论(0)    收藏  举报