在调用前修改回调函数的参数。

问题描述 投票:1回答:2

我有一个自定义对象,它实现了一个稍后执行的函数。下面是某人如何调用它。

customObject.onSomething(function(e) {
    // do something with e
    console.log('foobar');
});

下面是onSomething的创建过程:

var CustomObject = function() {
    this.onSomething = function(callback) {
        // If the user passes in parameter(s), how can I modify them before calling?
        callback.apply(this);
    }
}

我怎么才能在执行之前修改用户传入的参数?应用召唤 在函数上?

javascript parameters callback dom-events
2个回答
8
投票

apply 取第二个参数,即传递给函数的参数列表。call 做同样的事情,只是它传递了自己的参数列表(第一个参数之后的所有参数都被用作 this).

所以,如果你知道你所期望的参数,你可以将它们作为第二个参数添加到调用函数的 apply (或作为一个参数列表,以 call):

this.onSomething = function(arg1, arg2) {
   // reverse the first and second arguments
   callback.apply(this, [arg2, arg1]);
   // equivalent:
   callback.call(this, arg2, arg1);
};

如果你不知道会有什么样的争论,但你还是想用它们做一些事情,你可以用内置的 arguments 伪数组,它保存着给当前函数的参数(即使你没有明确声明它们)。

你可以用它来调用回调函数,使用与调用函数相同的参数,或者对它们进行一些转换;例如。

this.onSomething = function() {
    // call callback with the same arguments we got
    callback.apply(this, arguments);

    // or, make some changes
    var newArgs = ["extra argument", arguments[1], arguments[0]];
    callback.apply(this, newArgs);
};

1
投票

听起来你的要求相当简单,请看下面。

var CustomObject = function() {
    this.onSomething = function(callback, param1, param2) {
        param1 += 4;
        param2 = 'Something about ' + param2 + ' is different...';
        callback.apply(this, [param1, param2]);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.