如何在Javascript中获取document.onkeydown函数的名称

How to get name of document.onkeydown function in Javascript?

本文关键字:函数 onkeydown document 获取 Javascript      更新时间:2023-09-26

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

这取决于函数的分配方式。看看这个:

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

不,这是不可能的。函数名在javascript中并不明显。示例:

function john() {
    // ... do something ...
}
var jim = john;

您现在认为该函数的名称是什么?"约翰"还是"吉姆"?-他们都指向完全相同的东西,没有任何不同。另一个例子可以说明:

var john = function() { /* ... */ };
var jim = john;