2015-11-09 55 views
4

我將一個對象傳遞給一個函數。爲了便於閱讀,我拉出了作爲子對象的對象的屬性。但是,第二個對象不會影響第一個對象的類似屬性。爲什麼是這樣?爲什麼JavaScript變量沒有通過引用傳遞的對象?

我希望在保存事件時更新函數範圍外的processItem.event。爲什麼必須更新processItem,而不僅僅是指向它的局部變量?

這工作:

this.submitForm = function(processItem) { 
    var event = processItem.event 
    if (event.new) { 
     EventDataService.create(event).then(function(response) { 
      processItem.event = response.data; 
     }); 
    } else { 
     EventDataService.update(event).then(function(response) { 
      processitem.event = response.data 
     }); 
    } 
}; 

這並不

this.submitForm = function(processItem) { 
    var event = processItem.event 
    if (event.new) { 
     EventDataService.create(event).then(function(response) { 
      event = response.data; 
     }); 
    } else { 
     EventDataService.update(event).then(function(response) { 
      event = response.data 
     }); 
    } 
}; 
+1

JavaScript提供了所謂的「通過共享呼叫」(https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing)。在情況1中,您更改了原始對象的屬性。在情況2中,您只需重新分配引用而不更改'processItem'。 –

回答

7
var event = processItem.event 

現在event指的是同樣的事情processItem.event

event = response.data 

現在event指的是與response.data相同的東西,並且不再指代與processItem.event相同的東西。距離

processItem.event = response.data 

截然不同這將使與response.data(但不與任何event更多)processItem.event共同參考。

這與函數參數無關,但事實上JavaScript具有引用而不是別名。