ES5中 對函式的引數只能傳遞值的一些理解

2021-09-26 02:02:22 字數 1089 閱讀 2538

在es5中 引用型別的值(物件)作為引數將』值』傳遞給函式

function setname(obj)  

var person = new object();

setname(person);

alert(person.name); //"nicholas"

當setname(person);執行後,此時obj的索引和person的索引同時指向棧記憶體中的同 乙個物件,所以在函式外部的person可以也可以通過該物件的name屬性訪問到字串』nicholas』. 在我看來這是不符合書中的引數只能傳值這一概念,因為我認為只有通過傳遞引用,函式外部才可以訪問到函式中修改的值,如果是傳值的話,不符合js中作用域鏈的概念.

但是書中的另一段**讓我有了不同的認知,即:

function setname(obj)  

var person = new object();

setname(person);

alert(person.name); //"nicholas"

這裡的person最後訪問的是』nicholas』而不是』greg』, 我仔細思考了很久,我認為當物件在函式中重新被例項後,此時函式的原索引沒有消失,而是被一條新的索引所覆蓋,這條新索引我稱之為區域性索引,該索引指向新的乙個物件,這條索引的優先順序比原索引高,所以當區域性索引出現後,我們在函式內部訪問obj的name屬性只能訪問到』greg』.

當函式結束後,區域性索引被銷毀(這裡的銷毀我理解為函式中對區域性變數的銷毀,所以這裡我認為此時的obj既有物件的索引的概念又有簡單資料型別的值的概念),當區域性索引被銷毀後,原索引重新發揮作用,所以此時的person.name會訪問到原索引指向的物件. 所以才能訪問到』nicholas』.

此上是我個人對於引數只能傳值的理解,並且工作中可以通過這種想法解決問題.但是我認為可能有更好的解釋,

這個問題可能只是乙個es5中的坑,是我想複雜了 但是我是乙個比較追求細節的人,因此也可能鑽牛角尖,希望各位留下獨到的見解.

ES5到ES6的函式引數變化

es5 function howmany howmany 111 12 2 howmany 12 1 howmany 0es6 function sortnum rest const sortnum num return num.sort function stu grades,stu 89,18 ...

JavaScript中函式引數的值傳遞和引用傳遞

結論 對於數字 字串等是將它們的值傳遞給了函式引數,函式引數的改變不會影響函式外部的變數。對於陣列和物件等是將物件 陣列 的變數的值傳遞給了函式引數,這個變數儲存的指向物件 陣列 的位址。當函式改變這個位址指向的物件 陣列 的內容時,同時也改變了函式外部變數指向的物件 陣列 的內容 當函式改變的是變...

函式中引數傳遞的5種方式

1 必須引數 位置引數 必需引數 先用形式引數定義,然後在呼叫時對應位置使用實參 具體的數值 呼叫,定義的形式引數和呼叫的實際引數必需一一對應 順序 數量 def sum a,b return a b sum 5,6 2 關鍵字引數 關鍵字引數 先使用形式引數定義,然後呼叫時以關鍵字的形式 形式引數...