【问题标题】:Is there a way to look inside a (anonymous) function?有没有办法查看(匿名)函数的内部?
【发布时间】:2012-05-30 14:26:39
【问题描述】:

在 JavaScript 中,假设你有:

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

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

有没有办法从doSomething() 检查“回调”中的内容(例如,alert() 被调用的事实)?比如:

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

我只是好奇

【问题讨论】:

标签: javascript functional-programming anonymous-function


【解决方案1】:

部分浏览器支持toString()函数。

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

【讨论】:

  • Some browsers?它位于ECMA-262,所以我希望所有浏览器都支持它。你知道有哪些浏览器不支持吗?
  • @Saxoier duh,这是一个文本匹配。这不会是准确的。而你错过了var foo = "alert()";
  • 我“错过了”alert ( 和其他 1000 种可能性。
  • @RobG 应该适用于所有现代浏览器,大脑不记得 IE6 是否支持它,我不会打开虚拟机来测试它。
【解决方案2】:

你应该可以说:

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

但是,如果它恰好在字符串文字中,则无法区分函数 alert( 的开头、函数 myspecialalert( 和文本 "alert(" 的开头 - 所以您可能需要这样做一点解析。

不确定这是如何跨浏览器的,但在 Firefox 中至少 .toString() 返回函数的整个文本,包括单词“function”和参数列表。

【讨论】:

    【解决方案3】:
    callback.toString().indexOf('alert(');
    

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

    /alert *\(/.test(callback.toString());
    

    【讨论】:

      【解决方案4】:

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

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

      宿主方法可以返回任何东西,甚至抛出错误。所以严格的答案是肯定的,也许。但在实际意义上,它并不可靠。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-29
        • 2012-11-30
        • 2018-08-28
        相关资源
        最近更新 更多