在另一个函数中获取函数参数

时间:2013-10-24 04:48:40

标签: javascript

我听说有可能做这样的事情

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不是一个选项:/

3 个答案:

答案 0 :(得分:2)

使用addEventListener听起来更适合你。它允许您将多个侦听器(函数)附加到单个元素:

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

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

注意,根据MDN,IE> = 9支持addEventListener

如果您确实希望继续沿着当前路径前进,可以执行以下操作:

f = function(){
    cf.apply(this, arguments);
    func.apply(this, arguments);
}

答案 1 :(得分: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参数不是从查询上一个回调,而是从文档中查询。

答案 2 :(得分:0)

somefunction.arguments //Use the arguments property to get arguments of another function