JavaScript变量,作用域和内存

一.基本类型的值和引用类型的值

QQ截图20131018120635

区别:

1.

(1)基本类型值是按值访问的,可以操作保存在变量中实际的值,保存在栈内存中

(2)引用类型值是按引用访问的,操作对象时,实际在操作对象的引用而不是实际的值,保存在堆内存中

(3)包含引用类型的变量实际包含的并不是对象本身,而是一个指向该对象的指针

2.添加属性

引用类型的值可以为其添加属性和方法,基本类型的值不可以

3.复制变量值

(1)复制基本类型的值:创建这个值的副本

(2)复制引用类型的值:复制的是指针,两个变量引用同一个对象

4.传递参数

(1)ECMAScript中访问变量有按值和按引用两种方式,而参数只能按值传递

(2)参数可以看成是局部变量

(2)基本类型值的传递和基本类型变量的复制一样,被传递的值会复制给参数

function addNum(num){
    num+=10;
    return num;
}
var num1=20;
var result=addNum(num1);//参数按值传递
alert(num1);    //20  没变化
alert(result);  //30

(3)引用类型值的传递和引用类型变量的复制一样,把这个值在内存中的地址复制给参数,因此参数的变化会反映在函数外部

function myObject(obj){
    obj.name="liu";
    obj = new Object(); //重写时引用的是局部对象,在函数执行完后销毁
    obj.name="yang;"
}
var person=new Object();
myObject(person);    //参数按值传递
alert(person.name);  //"liu" obj和person引用同一个对象

5.检测类型

(1)用typeof检测基本数据类型

(2)用instanceof检测引用数据类型

所有引用数据类型都是Object 的实例

alert(person instanceof Object);//true

二.执行环境及作用域

1.所有变量都存在于一个执行环境(也称作用域)中

2.执行环境有全局执行环境(web浏览器的全局执行环境是window对象)和函数执行环境

3.每次进入一个新的执行环境,都会创建一个用于搜索变量和函数的作用域链

4.内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数

var color="blue";
function changeColor(){
    var anotherColor="red";

    function swapColor(){
        var otherColor="green";
        //这里可以访问color,anotherColor,otherColor
    }
    //这里可以访问color,anotherColor
    swapColor();
}
changeColor();
//这里只能访问color
QQ截图20131018130142 
5.延长作用域链
6.没有块级作用域
1.块级作用域:被花括号封闭起来的代码块都有自己的作用域
2.会将控制语句中的变量声明添加到执行环境中
if(true){
    var color="blue";//将变量添加到当前执行环境中
}
alert(color);
for(var i=0;i<10;i++){
    do(i);
}
alert(i);//10 for结束后i依旧存在于循环外部的执行环境中
3.声明变量:全局变量,var声明局部变量

4.查询标识符

var color="blue";
function getColor(){
    return color;
}
alert(getColor());//"blue"
QQ截图20131018123748

三.垃圾收集

1.标记清除

2.引用计数

(1)有循环引用时会无法清除(IE中的DOM,BOM)

3.管理内存

(1)解除引用:数据不再用时将其值设为null

(2)应及时解除不再使用的全局对象,全局对象属性以及循环引用变量的引用

原文地址:https://www.cnblogs.com/liuzhongyi1992/p/3439776.html