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;
}
答案 0 :(得分:1)
不,那是不可能的。函数名在javascript中没有区别。例如:
function john() {
// ... do something ...
}
var jim = john;
您现在会考虑该功能的名称? “约翰”或“吉姆”? - 他们都指向完全相同的东西,并没有任何不同。另一个例子可以澄清:
var john = function() { /* ... */ };
var jim = john;
答案 1 :(得分:1)
这取决于功能的分配方式。 看看这个:
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)。