在javascript中定义函数的参数列表

在javascript中定义函数的参数列表,javascript,Javascript,如果这是重复的话,我很抱歉,但我真的不知道怎么问这个问题。我的母语背景是,你可以控制参数的传递方式(通过值、引用或指针),尽管我已经使用javascript很多年了,但我仍然很难知道变量何时通过引用或值传递 我希望允许在javascript类中重写函数,但基本上我在传递参数作为函数引用时遇到了问题 我必须提供一个例子,因为我不知道如何确切地解释这一点 所以我有一个“类”,我称之为exampleClass: exampleClass = function() { var m_largear

如果这是重复的话,我很抱歉,但我真的不知道怎么问这个问题。我的母语背景是,你可以控制参数的传递方式(通过值、引用或指针),尽管我已经使用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_Largeary,当调用默认函数时,参数数据是我最初设置m_funcParams时的数据,而不是我更新m_Largeary时的数据,与重写函数时相同,如果我将somewidth从900更改为800,当我调用函数时,宽度参数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>

var exampleClass=函数()
{
var m_largearray=[1,2,3];
var m_宽度=100;
var m_funcParams={data:m_largearray,width:m_width};
var m_someFunction=函数(_参数){
//做事
警报(_参数数据[0]);
}
var m_最终价值=[];
返回{
doProcessing:function()
{
//做一些事情
m_finalValues=m_someFunction(m_funcParams);
//用m_最终值做一些事情
},
setFunction:function(_func,_params)
{
m_someFunction=_func;
m_funcParams=_params;
},
拉吉雷:m_拉吉雷,
宽度:m_宽度
}
}
var classinstance=exampleClass();
classinstance.largearray[0]=3;
classinstance.doProcessing();
classinstance.largearray=[7,8,9];
classinstance.doProcessing();
var somespecialarray=[4,5,6];
var-someint=5;
宽度=900;
classinstance.setFunction(函数(_参数){
//使用不同的参数集执行一些处理
//即使somewidth设置为400,我仍然会在这里得到_params.width=900
警报(参数宽度);
//返回一些数组
},
{data:somespecialray,anint:someint,width:somewidth});
somewidth=400;
classinstance.doProcessing();

我希望我理解正确,这会有所帮助

首先,当您将一个对象传递给一个函数时,它将作为引用传递,因此更改它的一个属性将更改引用对象的属性

但是,在示例中调用
classinstance.setFunction
时,您传递了一个具有属性
width
的对象,该属性接收变量
somewidth
,该变量不是对象,因此它按值传递

最后,当您将
someWidth
更改为800时,您只更改了
someWidth
,因为
width
是作为值传递的

编辑:
此外,在调用
classinstance.setFunction
时,您传递了一个带有param
_param
的函数,该函数不属于该范围。

JavaScript始终是按值传递的。它变得混乱,因为当值是对象时,它实际上是对对象的引用。然而,“参考传递”一词涉及“参考”一词但是有一个确切的含义,这与我们在讨论JavaScript对象引用时的含义不同。你能提供工作示例吗?好的,给我一点时间,我会将代码更改为一个工作示例。有一篇很好的Snook文章,其中有一些简单的示例:@Pointy,所以要清楚,当你传递一个对象时,你基本上是在传递一个指向对象的“指针”,这个对象基本上还是通过引用传递的,不是吗?我想我已经明白了这一点,当我“重新”设置一个作为参数传递的变量时,我实际上是在创建一个新变量并重用该名称。我希望有一种方法可以设置该变量的值,而不会丢失我作为参数传递的内容与我正在设置的变量之间的链接。这基本上是我在上面创建一个工作示例时得出的结论,谢谢,请检查我的添加编辑,我想你的代码还有一个问题,我不知道你的编辑是什么意思。它只是一个参数列表,不是参数。
setFunction
接受两个参数-\u func&\u params。不能在第一个参数中使用第二个参数,它们不共享相同的作用域,但要解决这个问题,我认为需要发生的是参数必须是一个对象,当您更改变量时,您必须更改对象的变量,而不是您最初传入的实际对象。这是科雷克吗