簡體   English   中英

覆蓋傳遞給函數的對象

[英]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傳遞對函數的引用,這意味着你的func1func2參數最終引用了標識符ab引用的相同函數(對象),但是當你改變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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM