对不起,如果这是重复的,但我真的不知道如何提出这个问题。我来自母语背景,您可以控制参数的传递方式(按值,参考或指针),即使我已使用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,当我调用该函数时,width参数i仍为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>
答案 0 :(得分:2)
我希望我理解正确,这有帮助。
首先,当您将对象传递给函数时,它会作为引用传递,因此更改其中一个属性将更改引用对象的属性。
但是,当您在示例中调用classinstance.setFunction
时,您传递了一个具有属性width
的对象,该对象收到了变量somewidth
,该变量不是对象,因此它通过值传递
最后,当您将someWidth
更改为800时,您只更改了someWidth
,因为width
已作为值传递。
编辑:
此外,在调用classinstance.setFunction
时,您传递了一个param _param
的函数,该函数不属于该范围。