JavaScript變量、做用域和內存問題

一、基本類型和引用類型的值前端

* 基本類型 : 指的是簡單的數據段,五種基本類型是按值訪問的,能夠直接操做保存在變量中實際的值。
* 引用類型 : 指那些可能由多個值組成的對象,引用類型的值是保存在內存中的對象,js不容許直接訪問內存中的位置,也就是不可直接操做對象的內存空間。

操做對象實際是操做對象的引用而不是實際的對象,引用類型的值按引用訪問。
二、動態的屬性
引用類型的值能夠添加屬性和方法,也能夠刪除和修改,但基本類型不行。
//引用類型函數

var person = new Object();
person.name = "sheyurong";
alert(person.name);      //sheyurong

基本類型添加屬性也不會報錯。
//基本類型ui

var name = "sheyurong"
name.age = 27;
alert(name.age) ;           //undefined

三、賦值變量值url

//基本類型code

var num1 = 5;
var num2 = num1;
// num1 與 num2 中的5徹底獨立,參與任何操做也不會相互影響

//引用類型對象

var obj1 = new Object();
var obj2 = obj1;
obj1.name = "syr";
alert(obj.name);   //"syr";
改變其中任一變量也會影響另外一個,由於兩個變量引用同一變量。

四、傳遞參數
es中全部函數的參數都是按值傳遞的,基本類型與引用類型的傳參與變量的複製同樣。內存

function setName(obj){
    obj.name = "syr";
    obj = new Object();
    obj.name = "abc"
}
var person = new Object();
setName(person);
alert(person);   // "syr"
//能夠把函數的傳參想象成局部變量同樣

五、檢測類型
typeof能夠檢測基本類型,但檢測對象時並不能知道是什麼類型的對象,所以,使用instanceof操做符。
語法 : 作用域

result = variable instanceof constructor
//若是變量爲引用類型的實例,則instanceof返回true
例 : person instanceof Object; // person是Object的實例嗎?
根據規定,全部引用類型都是object的實例,instanceof檢測基本類型,適中返回false,由於基本類型不是對象。it

六、執行環境及做用域io

* 執行環境決定了變量或函數有權訪問的其餘數據,決定了她們各自的行爲。
* 每一個執行環境都有一個環境變量對象,全部變量和函數都保存在這裏面,沒法訪問,可是後臺會使用它。
* 全局變量是最外圍的一個執行環境,代碼在環境中執行,會建立一個做用域鏈,用途是保證對執行環境有權訪問全部變量和函數的有序訪問。
* 做用域鏈 : 如環境是函數,則最開始只包含有一個變量-arguments對象 -> 外部環境1 -> 外部環境2 ... -> 全局。

做用域鏈中最後一個對象始終是全局執行環境。

* 內部環境能夠經過做用域鏈訪問全部的外部環境,外部則不能訪問內部。函數參數的訪問規則與執行環境其餘變量相同。

七、延長做用域鏈

* 使用try-catch語句的catch塊;
* with語句 :

都是會在做用域鏈的前端添加一個變量對象,with可將制定對象添加到做用域鏈中。
catch建立新變量,內涵跑出的錯誤對象聲明。

例 : function build(){
    var qs = 'aaa';
        with(location){
            var url = href + qs;
        } return url ;
}
//with吧location對象引入,此種就包含了location中全部屬性和方法。
相關文章
相關標籤/搜索