js 函數、參數傳遞、引用類型與基本類型

函數

參數

1.js函數不介意傳遞進來多少個參數,也不在意傳遞進來參數是什麼類型。
2.arguments對象:類數組
arguments對象的長度是由傳入的參數個數決定的,不是由定義函數時的參數(命名參數)個數決定的。
沒有傳遞值的命名參數自動被賦予undefined值。數組

基本類型和引用類型

用var操做符定義的變量將成爲做用域中的局部變量。就是說函數中 使用var定義一個變量,這個變量在函數退出後就會被銷燬。函數

基本類型:存儲在棧(stack)中的簡單數據段,也就是說,它們的值直接存儲在變量訪問的位置。
引用類型:存儲在堆中的對象,也就是說,存儲在變量處的值是一個指針,指向堆中的對象。指針

傳遞參數

全部函數的參數都是按值傳遞的。code

  • 在向參數傳遞基本類型的值時,被傳遞的值會被複制給一個局部變量,即命名參數。
    只是把變量裏的值傳遞給參數,以後參數和這個變量互不影響。對象

  • 在向參數傳遞引用類型的值時,會把 這個值在內存中的地址複製給一個局部變量,所以這個局部變量的變化會反映在函數的外部。
    對象變量它裏面的值是這個對象在堆內存中的內存地址,這一點你要時刻銘記在心! 對於數組和對象等是將對象(數組)的變量的值傳遞給了函數參數,這個變量保存的指向對象(數組)的地址。內存

    當函數改變這個地址指向的對象(數組)的內容時,同時也改變了函數外部變量指向的對象(數組)的內容;
    當函數改變的是變量的地址時,實際就與函數外部的變量失去了聯繫,變成了徹底不一樣的對象了,不會對函數外部對象形成改變。

來看書裏兩個經典的例子:作用域

function setName(obj){
            obj.name = "xiaoxiaozi";
        }
        var person = new Object();
        setName(person);
        alert(person.name); // 返回 xiaoxiaozi

在調用函數setName()時,person 被複制給了 obj 。所以在函數內部 obj 與 person 引用的是同一個對象,或者說是對同一個對象的引用。因此在給 obj 引用對象加上 name 屬性時,person 引用的對象也有了 name 屬性,由於雖然 obj 與 person 不一樣,可是兩者引用的對象是同一個。io

function setName(obj){
        obj.name = "xiaoxiaozi";
        obj = new Object();
        obj.name = "admin";
    }
    var person = new Object();
    setName(person);
    alert(person.name); // 結果依舊是 xiaoxiaozi

在調用 setName() 函數初時,obj 與 person 引用的是同一對象,因此首次的 name 屬性賦值會對 person 有所影響。可是當 obj 被從新定義時,其引用的對象已經與 person 不一樣,因此後面設置的 name 屬性,不會對 person 引用的對象有任何影響。function

相關文章
相關標籤/搜索