傳遞參數

js中所有的函數都是按值傳遞的。
在向參數傳遞基本類型時,被傳遞的值會被復制給一個局部變量。

在向參數傳遞引用類型的值時,會把這個值在內存中的地址復制給一個局部變量,因此這個局部變量的變化會反映在函數的外部。
    function addTen(num){
        num += 10;
        return num;
    }
    var count = 20;
    var result = addTen(count);
    alert(count);       //20,沒有變化
    alert(result);      //30

count傳遞給參數num,函數內部num做了修改,但是沒有反映到count上。

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

這個例子很容易讓人覺得,引用類型做為函數參數傳遞是按引用傳遞的,因為局部的修改:obj.name = "Jack",反映在了全局的作用域上:person.name,事實上并不是如此。

事實上:我們創建了一個對象,并把它保存在person變量中,然后把person當做參數傳遞到setName()函數中復制給了obj,在這個函數內部obj和person引用的是同一個對象。

再看一個例子:

    function setName(obj){
        obj.name = "Jack";
        obj = new Object();
        obj.name = "Rose";
    }
    var person = new Object();
    setName(person);
    alert(person.name);       //Jack

這個例子中在setName()函數中,為obj重新定義了一個對象,另一行代碼為該對象定義了一個帶有不同值的name屬性。如果person傳遞給函數setName()之后是按引用傳遞的,那么對obj.name的修改就會反映到person.name上,事實上person.name依然是Jack。

當在函數內部重寫obj時,這個變量的引用就是一個局部變量了,這個局部變量在函數執行完畢后立即銷毀。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容