Как получить имя функции document.onkeydown в javascript? - PullRequest
0 голосов
/ 29 марта 2012

document.onkeydown.toString () возвращает функцию onkeydown, но я хочу получить только имя этой функции.

Возможно ли это?

var exHandler;
function getCurrentHandler(){
   currentHandler = document.onkeydownhandler.toString() - i want to get name of this to call setPreviousHandler with exHandler

document.onkeydown = newFunction;

setPreviousHandler(exHandler);
}

function setPreviousHandler(targetHandler){
   document.onkeydown = targetHandler;
}

Ответы [ 2 ]

1 голос
/ 29 марта 2012

Зависит от того, как была назначена функция. Взгляните на это:

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).

1 голос
/ 29 марта 2012

Нет, это невозможно.Имена функций не различаются в JavaScript.Пример:

function john() {
    // ... do something ...
}

var jim = john;

Что бы вы назвали именем этой функции?"Джон" или "Джим"?- они оба указывают на одно и то же и ничем не отличаются.Другой пример может пояснить, что:

var john = function() { /* ... */ };
var jim = john;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...