2012-05-24 57 views
1

在JavaScript中,假设您有:有没有办法查看一个(匿名)函数?

function doSomething(callback) { 
    if (callback instanceof Function) callback(); 
} 

doSomething(function() { 
    alert('hello world'); 
}); 

有没有一种方法来检查里面是什么“回调”(喜欢,事实证明alert()叫)从doSomething()?喜欢的东西:

function doSomething(callback) { 
    alert(callback.innards().indexOf('alert(')); 
} 

我只是好奇

+5

你为什么想要做这样的事情? – asawyer

+1

关于typeof与instanceof的很好的讨论在这里:http://stackoverflow.com/questions/899574/which-is-best-to-use-typeof-or-instanceof – ScottE

回答

2

Function.prototype.toString()给出了一个implementation-dependent representation of the function。然而,内置函数将返回如下内容:

function Array() { 
    /* [native code] */ 
} 

和主机方法可以返回任何内容,甚至会抛出错误。所以严格的答案是肯定的,也许。但从实际意义上讲,这并不可靠。

1

有些浏览器支持toString()上的功能。

function doSomething(callback) { 
    console.log(callback.toString().indexOf('alert(')) 
    if (callback instanceof Function) callback(); 
} 
+0

'有些浏览器'?它在[ECMA-262](http://es5.github.com/#x15.3.4.2)中,所以我希望所有浏览器都支持它。你知道任何没有的浏览器吗? – RobG

+0

[这不是那么简单。](http://jsfiddle.net/YxRbn/) – Saxoier

+0

@Saxoier duh,这是一个文本匹配。这不会是准确的。你错过了'var foo =“alert()”;' – epascarello

0

你应该能够说:

alert(callback.toString().indexOf('alert(')); 

然而,这将不是一个函数alert(的开始区分,功能myspecialalert(的开始,和文本"alert("如果碰巧在字符串文字中 - 所以你可能需要做一些解析。

不知道这是如何跨浏览器,但在Firefox中至少返回.toString()函数的全部文本,包括单词“功能”和参数列表。

0
callback.toString().indexOf('alert('); 

或者做一个正则表达式匹配,如:

/alert *\(/.test(callback.toString()); 
相关问题