0

請解釋爲什麼在本地作用域中更改全局對象字符串屬性確實會影響全局作用域中的屬性,但是爲整個對象賦予新的值不會。爲什麼在本地給全局JavaScript對象賦值時有所不同?

在我的例子中,我第一次運行changeMyName函數,我得到了我期待的 - my_global_object.name值的變化。

但是爲什麼我第二次運行該函數會將my_global_object對象更改爲my_global_object.children.first_child對象?

var my_global_object=new Object(); 
my_global_object.name='my parent name' 
my_global_object.children=new Object(); 
my_global_object.children.first_child=new Object(); 
my_global_object.children.first_child.name='my first child name'; 

function changeMyName(child_name,new_name){ 
    var my_local_object; 
    my_local_object=my_global_object; 
    if(child_name) my_local_object=my_local_object.children[child_name]; 
    my_local_object.name=new_name; 
} 

changeMyName(false,'new parent name'); 

changeMyName('first_child','new first child name'); 

這是爲什麼 「=」 賦值從這個 「=」

if(child_name) my_local_object=my_local_object.children[child_name]; 

不同?

my_local_object.name=new_name; 

有沒有某種「給予價值」和「傳遞引用」的區別?

+0

請解釋你的第一行。你在哪裏更改了代碼中的全局對象? – NINCOMPOOP

+0

在changeMyName函數中,我將全局對象分配給本地對象,並更改其名稱屬性的值。如果我在那之後記錄了my_global_object,它就有我傳遞給該函數的名稱。 –

回答

1
my_local_object=my_global_object; 

分配由可變my_global_object稱爲可變my_local_object這裏的對象的引用。所以現在兩個變量都指向同一個對象。

my_local_object.name=new_name; 

更新對象,這是由兩個變量my_global_objectmy_local_object引用的name屬性,因此my_global_object.name將相同my_local_object.name

my_local_object=my_local_object.children[child_name]; 

分配可變my_local_object參考由my_local_object.children[child_name]引用的對象。所以現在my_local_object變量並不指向由my_global_object變量引用的對象。

相關問題