[英]Overriding an object that was passed to a function
我最近想知道這是否可能:將一個對象傳遞給一個函數,並用該函數內部的一個完全不同的對象覆蓋整個對象,以便永久修改它的值。 由於對象是通過引用傳遞的,我覺得它必須以某種方式工作,但我不知道如何。 要把它放在代碼中,它應該做這樣的事情:
function a() {
console.log("i am a");
}
function b() {
console.log("i am b");
}
function override(func1, func2) {
func1 = func2;
}
override(a, b);
a(); //"i am b" expected
這顯然不起作用,因為我只是覆蓋變量func1
但我認為你明白了。 我選擇使用函數而不是純對象,因為您可以通過刪除其屬性並從第二個對象復制新屬性來輕松“覆蓋”對象。 但這不是我想要的。
在你問之前,我並不想用這個來解決任何現實生活中的問題,我只是出於好奇而問。 那么有沒有辦法實現這一點,如果沒有,是否有理由不這樣做?
謝謝!
這不起作用,因為雖然JS傳遞對函數的引用,這意味着你的func1
和func2
參數最終引用了標識符a
和b
引用的相同函數(對象),但是當你改變func1
引用的那些函數時牛逼影響什么a
指。
換句話說,當您將對象傳遞給函數時,該函數可以通過修改,添加或刪除屬性來更改對象的內容,但它不能更改函數外部的變量引用的對象。 (至少,不是通過函數自己的參數 - 函數可以修改其范圍鏈中的變量,直到並包括全局變量,但它必須通過自己的名稱引用它們來實現。)
在你的代碼中
function override(func1, func2) {
func1 = func2;
}
func1
是指向函數a
的變量, func2
是指向函數b
的變量。 語句func1 = func2
使func1
指向b。 它不會更改函數override
之外的任何內容。
請使用對象來使用傳遞參考 。 下面給出的代碼說明了它的工作原理。
function a() {
console.log("i am a");
}
function b() {
console.log("i am b");
}
var object1 = {
func1:a
};
var object2 = {
func2:b
}
function override(object1, object2) {
object1.func1 = object2.func2;
}
override(object1, object2);
object1.func1(); //"i am b"
此代碼僅用於演示,在實際場景中可能沒有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.