代码改变世界

变量、作用域及内存

2015-12-08 18:39  孤独大兔子  阅读(181)  评论(0编辑  收藏  举报

变量只有两种,基本类型和引用类型
基本类型的值放在栈内存中,引用类型的值放在堆内存中
基本类型有:Undefined、Null、Boolean和String
引用类型:Object

1、基本类型分别操作,互不影响

var box="lee"
var box2=box;
box2="kkk";
alert(box2);    //kkk
alert(box);     //lee

2、引用类型指向同一个地址

var box=new Object();
box.name="lee";
var box2=box;
box2.name="cc"
alert(box2.name);    //cc
alert(box.name);     //cc

3、传递参数,参数都是按值传送的,没有类型之分

function box(num){   
    num+=10;
    return num;
}
var num=50;
alert(box(num));     //60
alert(num);          //50

4、参数作为引用类型的例子

function box(obj){  
    obj.name="lee";
    var aa=new Object();
    aa.name="kkk";
}
var cc=new Object();
box(cc);
alert(cc.name);    //lee

 5、全局变量和局部变量

全局变量就是window,所以全局变量都是window下的属性,可以用window.来访问

var box="lee";
function serBox(){
    var box="red";   //这是局部变量,他们的范围在serBox()里,出来就不认识了
}
alert(box);   //"lee"  
serBox();
alert(box);   //"lee" 

但是如果要是去掉var就变成全局的了

var box="lee";
function serBox(){
    box="red";   //没有初始化,又调用的全局的
}
alert(box);   //"lee"  
serBox();
alert(box);   //"red" 

如果传参,作用域也在局部

var box='lee';
function serBox(box){
    alert(box);
}
serBox('red');
alert(box);

函数体内包含函数,只有这一层才能访问局部函数

var box='lee';
function serBox(){
    function setColor(){    //setColor()作用域在serBox()内
        return 123;
    }
    return setColor();
}
alert(serBox());    //123
var box='lee';
function serBox(){
    return setColor();
    function setColor(){    //setColor()作用域在serBox()内
        var b="kkk";        //b的作用域在setColor()里
        alert(b);        
        return 123;
    }

}
alert(window.serBox());    //kkk 123

在变量查询中,访问局部变量要比全局变量要快,因为不需要向上搜索作用域

var age=28;
function box(){
    //var age=26;    如果有他,打印26,一旦查询到,不会继续向上查找
    return age;
}
alert(box());    //28