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 vs. 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()); 
Смежные вопросы