《Javascript 高级程序设计》-第4章:知识总结

《变量、作用域和内存问题》

一、
1、JavaScript变量可能包含两种不同类型的值:基本类型值和引用类型值。基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象。
5种基本数据类型是按值访问的,因为可以操作保存在变量中的实际值。
引用类型的值是保存在内存中的对象。与其他语言不同,JavaScript不允许访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。为此,引用类型的值是按引用访问的。

2、只能给引用类型值动态添加属性。

3、赋值变量值:基本数据类型值和副本是完全独立的;
引用类型复制的值(副本)其实是一个指针,两个变量实际上引用同一个对象(储存在堆中的某个对象)。

4、所有函数的参数都是按值传递的,在传递引用类型的值时,会把这个值(全局对象)在内存中的地址赋值给一个局部变量,局部变量(函数参数)的变化会反映在函数外部。而且,即使在函数内部修改了参数的值,单原始的值传递的对全局对象的引用没有改变(也证明了函数参数是值传递而非引用传递)
eg:

/*引用数据类型的函数参数传递*/
function setName(obj){
    obj.name="summer";
    obj=new Object();
    obj.name="rose";

}

var  person=new Object();
setName(person);
alert(person.name);

警示框结果为:summer

5、在检测引用类型的值时(根据原型链可识别),(想知道它是什么类型的对象),用instanceof操作符,如果变量是给定引用类型的实例则返回ture;(ps:所有引用类型的值都是Object的实例,都返回ture)

6、使用tepyof检测函数时,safari 5级以前和Chorome 7及以前返回“function”;对正则表达式也返回”fuction“;
IE、FF对正则表达式返回“object”。

二、
1、执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为。每个执行环境都以一个与之关联的变量对象(后台使用)

2、每个函数都有自己的执行环境(环境栈机制)。

3、当代吗在一个环境中执行时,会创建变量对象的一个作用域链,保证对执行环境有权访问的所有变量和函数的有序访问。
作用域链前端(当前执行代码所在环境的变量对象,比如函数环境里的活动对象)
作用域链的最后一个对象:全局执行环境的变量对象

4、在局部作用域中定义的变量对象可以在局部环境与全局变量互换使用。

5、内部环境可以通过作用域链访问所有外部环境,反之不行。这些环境之间的联系是线性的、有序的。

6、执行环境的类型两种:全局和局部环境(函数)
但可以在一下两种情况延长作用域链:前端临时增加,代码执行后移除
A:try catch 的catch 语块(IE8以后创建的是catch中的变量对象)
B:with(~)

/*延长作用域链*/

function buildUrl() {
    var qs = "sdkjhds";
    with (location)
    {
        var url = href + qs;
    }
    console.log(url);
}

buildUrl();

7、没有块级作用域(和C不同之处)
比如if语句、for语句,执行结束后,依旧存在与外部执行环境中(相近的)
使用var申明的变量会自动被添加到最近的执行环境中;在with语句中,最接近的环境是函数环境;没有使用var申明,则添加到全局环境。

8、初始化变量之前,一定要先申明最好,严格模式下,初始化未经申明的变量会导致错误。

9、如果局部环境中存在同名标识符,就不会使用父环境中的标识符。

1、自动垃圾收集机制:
标记清除:主流
引用清除:在IE中访问非原生javascript对象 以及代码中存在循环引用现象会导致问题

2、解除变量:通过将其值设置为null (不再使用的全局对象、全局变量以及循环引用变量的引用)

本章知识总结已完成!

发布了6 篇原创文章 · 获赞 7 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章