[英]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.