簡體   English   中英

在javascript中定義函數的參數列表

[英]define argument list for function in javascript

如果這是重復的,我很抱歉,但我真的不知道如何問這個問題。 我來自母語背景,您可以控制參數的傳遞方式(按值、引用或指針),盡管我已經使用 javascript 多年,但我仍然很難知道什么時候變量有時通過引用或值傳遞。

我想允許在 javascript 類中覆蓋一個函數,但基本上我在將參數作為對函數的引用傳遞時遇到了問題。

我將不得不提供一個例子,因為我不知道如何解釋這一點。

所以我有一個“類”,我稱之為exampleClass:

exampleClass = function()
{
    var m_largearray = [];
    var m_width = 100;
    var m_funcParams = {data: m_largearray, width:m_width};
    var m_someFunction = function(_params){
        // do stuff
    }
    var m_finalValues = [];
    return {
        doProcessing: function()
        {
            // do some things
            m_finalValues = m_someFunction(m_funcParams);
            // do stuff with the m_finalValues
        }
        setFunction: function(_func, _params)
        {
            m_someFunction = _func;
            m_funcParams = _params;
        },
        largearray: m_largearray,
        width: m_width
    }
}

所以這個類有一個被調用的函數,doProcessing()。 在這個函數內部,它調用另一個執行部分處理的函數,但是當我不希望以默認方式處理數據時,我希望在類之外控制這部分處理。

所以像這樣:

var classinstance = exampleClass();
var somespecialarray = [];
var someint = 5;
var somewidth = 900;
classinstance.setFunction(function(_params){
    // do some processing with different set of params
    // even though somewidth was set to 400, i will still get _params.width = 900 here
    // return some array
},
{data:somespecialarray, anint:someint, width:somewidth});
somewidth = 400;
classinstance.doProcessing();

這只是我正在嘗試做的事情的一個完整示例,我只是在這里寫了這段代碼,所以如果有錯誤,那就是原因。

無論如何,問題在於我設置的參數列表(我嘗試使用數組而不是對象)。 當我設置 m_funcParams 時,數據似乎被復制而不是被引用。 當我更改這些參數時,例如 m_largearray,當調用默認函數時,參數數據是我最初設置 m_funcParams 時的數據,而不是我將 m_largearray 更新為的數據,與我覆蓋函數時相同,如果我將 somewidth 從 900 更改為 800,當我調用該函數時,寬度參數仍為 900。

我希望這是有道理的,我只需要弄清楚為什么函數沒有獲得更新的值,以及是否有更好的方法來做到這一點。

那么,為什么函數沒有得到改變的值,有沒有更好的方法來做到這一點?

編輯:這是一個完整的工作示例。 我想我剛剛意識到當我將變量設置為其他東西時,我基本上失去了一個指向它之前的值的“指針”。 如果我在數組中設置一個元素,它會在函數中更新,但如果我設置整個數組,它不會

<html>
<body>
<script>
var exampleClass = function()
{
    var m_largearray = [1,2,3];
    var m_width = 100;
    var m_funcParams = {data: m_largearray, width:m_width};
    var m_someFunction = function(_params){
        // do stuff
        alert(_params.data[0]);
    }
    var m_finalValues = [];
    return {
        doProcessing: function()
        {
            // do some things
            m_finalValues = m_someFunction(m_funcParams);
            // do stuff with the m_finalValues
        },
        setFunction: function(_func, _params)
        {
            m_someFunction = _func;
            m_funcParams = _params;
        },
        largearray: m_largearray,
        width: m_width
    }
}

var classinstance = exampleClass();
classinstance.largearray[0] = 3;
classinstance.doProcessing();

classinstance.largearray = [7,8,9];
classinstance.doProcessing();

var somespecialarray = [4,5,6];
var someint = 5;
var somewidth = 900;
classinstance.setFunction(function(_params){
    // do some processing with different set of params
    // even though somewidth was set to 400, i will still get _params.width = 900 here
    alert(_params.width);
    // return some array
},
{data:somespecialarray, anint:someint, width:somewidth});
somewidth = 400;
classinstance.doProcessing();
</script>
</body>
</html>

我希望我理解正確,這會有所幫助。

首先,當您將對象傳遞給作為引用傳遞的函數時,因此更改其中一個屬性將更改引用對象的屬性。

但是,當您在示例中調用classinstance.setFunction時,您傳遞了一個具有屬性width的對象,該對象接收了變量somewidth ,它不是一個對象,因此它是按值傳遞的。

最后,當您將someWidth更改為 800 時,您只更改了someWidth ,因為width是作為值傳遞的。

編輯:此外,在調用classinstance.setFunction ,您傳遞了一個不屬於該范圍的參數為_param的函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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