1

我有一个自定义对象,它实现了稍后将执行的功能。有人会这样称呼它:

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);
    }
}

如何在对函数执行应用调用之前修改用户传入的参数?

4

2 回答 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);
};
于 2012-10-13T20:27:14.097 回答
1

听起来你要的很简单,见下文:

var CustomObject = function() {
    this.onSomething = function(callback, param1, param2) {
        param1 += 4;
        param2 = 'Something about ' + param2 + ' is different...';
        callback.apply(this, [param1, param2]);
    }
}
于 2012-10-13T20:27:23.187 回答