摘要:簡單情況在執行后,的地址被作為參數傳入,并以變量名保存。之后,保存的是新對象的地址。所以通過訪問地址,顯示內容變化。運行,函數中有個局部變量,對其一頓操作后,將這個對象的地址返回,通過賦給。此時指向的地址仍是。所以修改的是地址為的對象。
簡單情況
var v1 = {} function func(obj){ obj = { name:"v1" } } function fund(obj){ obj.name = "v1" } func(v1) console.log(v1) // {} fund(v1) console.log(v1) // { name: "v1" }
在執行func(v1)后,v1的地址address01被作為參數傳入,并以變量名obj保存。obj ={name:"v1"}之后,obj保存的是新對象的地址address04。而v1保存的地址address01沒有變化。其后執行fund(v1),v1的地址address01被作為參數傳入,并以變量名obj保存。obj.name = "v1",修改地址address01中名為name的值。所以通過v1訪問地址,顯示內容變化。
復雜情況function c() { var obj = { v: 1 } obj.fund = function () { obj.v++ } obj.func = function () { obj = { v: -1 } } return obj } var c1 = c() c1.func() console.log(c1) // { v: 1, fund: [Function], func: [Function] } c1.fund() console.log(c1) // { v: 1, fund: [Function], func: [Function] }
首先執行var c1 = c()。運行c(),函數c中有個局部變量obj,對其一頓操作后,將這個對象的地址address02返回,通過c1=,賦給c1。
接著執行c1.func()。函數func調用的是其外部變量obj,原本變量名obj對應的地址是address02,經過obj={v:-1},用新對象的地址address05代替原來的地址。此時c1指向的地址仍是address02。所以c1.fund()修改的是地址為address05的對象。
修改代碼證明一下
function c() { var obj = { v: 1 } obj.fund = function () { obj.v++ } obj.func = function () { obj = { v: -1 } } obj.getObj = function () { return obj } return obj } var c1 = c() var innerObj1 = c1.getObj() c1.func() var innerObj2 = c1.getObj() console.log(innerObj1 === innerObj2) // false
在沒執行c1.func()之前,函數getObj訪問的是函數c中的局部變量obj,其地址是address02。在執行c1.func()之后,函數getObj訪問的仍是函數c中的局部變量obj,但其地址已經變成address06。
含this的情況function c() { this.obj = { v: 1 }; this.func = function () { this.obj = { v: 2 }; }; } var c2 = new c(); var obj1 = c2.obj c2.func(); console.log(c2.obj.v); // 2 console.log(c2.obj === obj1) // false最后一個例子
function setName(obj){ obj.name="ted"; // 第二步 obj=new Object(); // 第三步 obj.name="marry"; // 第四步 } var obj=new Object(); // 第一步 setName(obj); // 進入第二步 console.log(obj.name); // ted
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/89484.html
摘要:它對數組和對象使用按值傳遞,但這是在的共享傳參或拷貝的引用中使用的按值傳參。例如在這里,變量和值在執行期間存儲在堆棧中。返回值這是可選的,函數可以返回值,也可以不返回值。變量被推入堆棧,從而在執行時成為的副本。 這是專門探索 JavaScript 及其所構建的組件的系列文章的第 22 篇。 想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等著你! 如果你錯過了前面的章節,可...
摘要:它對數組和對象使用按值傳遞,但這是在的共享傳參或拷貝的引用中使用的按值傳參。例如在這里,變量和值在執行期間存儲在堆棧中。返回值這是可選的,函數可以返回值,也可以不返回值。變量被推入堆棧,從而在執行時成為的副本。 這是專門探索 JavaScript 及其所構建的組件的系列文章的第 22 篇。 想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等著你! 如果你錯過了前面的章節,可...
摘要:講清楚之參數傳值參數傳值是指函數調用時,給函數傳遞配置或運行參數的行為,包括通過進行傳值。所以對的賦值會改變上下文棧中標識符保存的具體值此時如果使用的是按引用傳遞,則變量所指向的對象因該也被賦值為。 講清楚之 javascript 參數傳值 參數傳值是指函數調用時,給函數傳遞配置或運行參數的行為,包括通過call、apply 進行傳值。 在實際開發中,我們總結javascript參數傳...
摘要:緩存攻擊是和個人電腦相關的一種邊信道攻擊,因為高速緩沖區被不同的進程和用戶使用而導致了信息的泄露。報告中的攻擊方式因此是高度可行的對于攻擊者的假設和限定是實際的運行的時間是實際的給攻擊者帶來的好處也是實際的。 原文 The Spy in the Sandbox – Practical Cache Attacks in Javascript 相關論文可在 https://github.c...
閱讀 1338·2023-04-25 15:21
閱讀 2670·2021-11-24 10:23
閱讀 3397·2021-10-11 10:59
閱讀 3243·2021-09-03 10:28
閱讀 1731·2019-08-26 13:45
閱讀 2319·2019-08-26 12:11
閱讀 921·2019-08-26 12:00
閱讀 1705·2019-08-26 10:44