Зависит от того, как была назначена функция.
Взгляните на это:
function test() { alert('test'); }
window.onkeydown = test;
window.onkeydown.toString();
вывод равен function test() { alert('test'); }
, и вы можете проанализировать эту строку, чтобы получить ее имя в виде строки:
var fnsting = window.onkeydown.toString();
// use regexp to extract name
var name = fnsting.match( /function\s*(.*?)\s*\(/ )[1]; // name is 'test'
(оно всегда возвращает имя из определения функции (когда вы передаете эту функцию другой переменной .toString()
всегда возвращает одну и ту же строку)
но следующий пример:
window.onkeydown = function () { alert('test'); };
window.onkeydown.toString();
напечатает function () { alert('test'); }
, потому что эта функция анонимна, поэтому вы не можете получить ее имя.
Более того, когда вы создаете такую функцию:
var test = function () { alert('test'); };
window.onkeydown = test;
window.onkeydown.toString();
и вывод будет function () { alert('test'); }
, потому что при создании у функции не было имени (это было выражение функции, назначенное переменной), поэтому вы также не можете извлечь ее имя.
Но вы можете сделать простое сравнение:
function foo() { alert('foo'); }
var bar = function () { alert('bar'); };
window.onkeydown = foo;
// try to find function
if (window.onkeydown === foo) {
alert('this is foo');
} else if (window.onkeydown === bar) {
alert('this is bar');
}
// or like this:
var handler = window.onkeydown;
if (handler === foo) {
alert('this is foo');
} else if (handler === bar) {
alert('this is bar');
}
Но есть и проблема с этим, потому что когда вы назначаете анонимную функцию следующим образом:
window.onkeydown = function () { alert('test'); };
У вас нет другой ссылки на эту функцию (она не назначена другой переменной), поэтому вы не можете сравнить ее с другой функцией (сравнение всегда возвращает false).