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

Javascript 在另一个函数中获取函数参数,javascript,Javascript,我听说这样做是可能的 this[func].apply(this, Array.prototype.slice.call(arguments, 1)); 但是要访问参数对象,我需要在该函数中 例如,如果我在函数function1中运行一个代码,有没有办法获取另一个函数function2的参数 整个问题是我想向任何给定元素添加事件。但是这个元素可能已经附加了另一个事件。因此,例如,如果有一个“onclick”事件附加到元素,我将执行以下操作: var event = 'onclick'; if(

我听说这样做是可能的

this[func].apply(this, Array.prototype.slice.call(arguments, 1));
但是要访问
参数
对象,我需要在该函数中

例如,如果我在函数
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不是一个选项://

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

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);
}
听起来使用会更适合你。它允许您将多个侦听器(函数)附加到单个元素:

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);
}
听起来使用会更适合你。它允许您将多个侦听器(函数)附加到单个元素:

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);
}
听起来使用会更适合你。它允许您将多个侦听器(函数)附加到单个元素:

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

对于您特定的情况,不必弄清楚传递给函数的参数是什么,因为您知道它是什么-所有浏览器中的事件对象,除了(旧的)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
参数不是从查询以前的回调中得到的,而是从文档中得到的。

对于您特定的情况,不需要确定传递给函数的参数是什么,因为您知道它是什么-所有浏览器中的事件对象,除了(旧的)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
参数不是从查询以前的回调中得到的,而是从文档中得到的。

对于您特定的情况,不需要确定传递给函数的参数是什么,因为您知道它是什么-所有浏览器中的事件对象,除了(旧的)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(