2013-10-24 6 views
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 не вариант:/

+0

Пожалуйста, просто используйте 'addEventListener' или' attachEvent'; намного проще. –

+0

Для этого конкретного случая вы знаете, какие аргументы получат обе функции - они одни и те же аргументы и не могут измениться. Это объект 'event' во всех браузерах, кроме IE, где он не определен. – slebetman

ответ

2

Похоже, используя addEventListener будет работать лучше для вас. Это позволяет подключить несколько слушателей (функции) к одному элементу:

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

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

Примечание, согласно MDN, addEventListener поддерживается в IE> = 9.

Если ты хочешь, чтобы продолжить вниз ваш текущий путь , вы можете сделать:

f = function(){ 
    cf.apply(this, arguments); 
    func.apply(this, arguments); 
} 
0
somefunction.arguments //Use the arguments property to get arguments of another function 
+0

'caller' устарел и его следует избегать. Вторая половина ответа go-oleg - лучший подход –

+0

@MattGreer Я этого не знал. Я не могу представить, почему они это сделают. Во всяком случае, это был пример. – bjb568

1

для вас конкретного случая, это не обязательно, чтобы выяснить, какие аргументы передаются функции, так как вы знаете, что это - OBJE событие ct во всех браузерах, кроме (более старого) 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. Обратный вызов будет вызываться с одним аргументом - возвращенные данные или без аргумента (undefined), если произошла ошибка.

OK. Таким образом, мы используем это следующим образом:

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 аргумент не из запроса предыдущего обратного вызова, но из документации.

Смежные вопросы