網頁

Javascript function 的參數何時參考到原物件?

今天在Stackoverflow上看到一個問題 - Overwriting variables inside functions in JS 

很多人都搞不懂這個重要觀念,因此在幫忙解答後,決定PO在這裡和大家分享。

Q1:為何這樣寫 o 還是沒有變,請各位也一起思考看看:
var o = {x: 1};
function foo(){
    // Overwrite var `o` with a string
    arguments[0] = "string";
}
foo(o);
console.log(o); // Why is `o` still an object and not the string `string`?
感謝網友發問,為什麼function沒有設定參數,foo(o)還可以呼叫,請參考小弟之前寫的Javascript function參數傳遞,這裡的arguments[0]其實就是傳進來的第一個參數,因此上面函式實際等同於:
var o = {x: 1};
function foo(a){
    // Overwrite var `o` with a string
    a = "string";
}
foo(o);
console.log(o); // Why is `o` still an object and not the string `string`?
答:這是因為在Javascript中,如果在function裡只改變物件"本身的值(value)",是不會改變原本物件的,意即上述做法不會更改變數o的值。但如果改變物件的內部,就會去永久改到原先的物件
因此以下方式改寫才能改變 o 的值:
var o = {x: 1};
function foo(){
    // Overwrite var `o` with a string
   arguments[0] = "string";
   return arguments[0];}
o = foo(o);
console.log(o);//will be "string"

var o = {x: 1};
function foo(){
    // Overwrite var `o` with a string
   arguments[0].x = "string";
   }
foo(o);
console.log(o);//will be {x: "string"}
Q2:下面這樣為什麼會變呢? 
var a = ["a","b"];
function foo(){
    // Overwrite var `o` with a string
    arguments[0][0] = "c";}
foo(a)
console.log(a)//will be ["c", "b"]
如同先前提到的,這裡我們改變了array a 的 a[0] 屬性,因此當然就會變囉!

Q3:為甚麼又改不到a的值了?
var a = ["a", "b"];
function foo(){
    arguments[0] = "c";}
foo(a[0]);
console.log(a);//will be ["a", "b"]
如同先前強調的,這裡我們只是改變 a[0] 這個物件"本身的值",當然就不會改到array a 了!

沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...