0

我听说可以做这样的事情

this[func].apply(this, Array.prototype.slice.call(arguments, 1));

但是要访问该arguments对象,我需要在该函数内部。

那么,例如,如果我在函数中运行代码function1,有没有办法获取不同函数的参数function2

整个问题是我想向任何给定元素添加事件。但是这个元素可能已经附加了另一个事件。因此,如果我有一个附加到元素的“onclick”事件,我会执行以下操作:

var event = 'onclick';
if(typeof currentElement[event] === 'function'){
    cf = currentElement[event];
    f = function(){
        cf();
        func();
    }
}else f = func;

currentElement[event] = f;

现在两个函数,新函数和前一个函数,都被调用了。问题是传递给前一个函数的参数在这个方法中丢失了。

有谁知道当我们像我的示例中那样动态调用函数时是否可以不丢失参数?

OBS:jQuery 不是一个选项:/

4

3 回答 3

2

听起来像使用addEventListener会更好地为你工作。它允许您将多个侦听器(函数)附加到单个元素:

elem.addEventListener("click", function() {
  console.log("click listener 1");
});

elem.addEventListener("click", function() {
  console.log("click listener 2");
});

请注意,根据 MDN,addEventListenerIE >= 9 支持。

如果您确实想继续当前的路径,您可以执行以下操作:

f = function(){
    cf.apply(this, arguments);
    func.apply(this, arguments);
}
于 2013-10-24T05:00:42.533 回答
1

对于您的特定情况,没有必要弄清楚传递给函数的参数是什么,因为您知道它是什么 - 所有浏览器中的事件对象,除了(较旧的)IE,它什么都没有(未定义)。

所以代码可以简单地是:

var event = 'onclick';
if(typeof currentElement[event] === 'function'){
    cf = currentElement[event];
    f = function(e){
        cf(e);
        func(e);
    }
} else f = func;
currentElement[event] = f;

如果可能,请使用 addEventListner 和 attachEvent 作为后备,以便与可能在您的页面上运行的其他脚本很好地配合使用。


补充讨论:

一般来说,从来没有必要弄清楚传递给回调函数的内容,因为这甚至没有意义。程序员无法确定将什么传递给回调,它是事件发射器确定传递什么。在这种情况下,它是事件对象,但这是一般规则。

例如,我们有一个 API 可以查询我们的数据库并返回一些数据:

function my_api (query) {}; // returns an object where a callback may
                            // be attached to the oncomplete property

API文档提到:

my_api() 返回一个 API 对象。

API 对象 - 具有一个属性 - oncomplete,其中可以附加回调以处理从 api 调用返回的数据。如果发生错误,将使用一个参数调用回调 - 返回的数据或无参数(未定义)。

好的。所以我们这样使用它:

var db = my_api('get something');
db.oncomplete = function (data) {alert(data)};

现在,如果我们想将 oncomplete 事件包装在另一个事件处理程序中,我们不需要知道它接受什么数据,因为它是决定传递给函数的内容的 API 对象,而不是函数!所以我们简单地:

var tmp = db.oncomplete;
db.oncomplete = function (x) {
    new_callback(x);
    tmp(x);
}

我们x不是从查询前一个回调中获得参数,而是从文档中获得参数。

于 2013-10-24T05:24:00.600 回答
0
somefunction.arguments //Use the arguments property to get arguments of another function
于 2013-10-24T05:01:00.273 回答