匿名函数javascript,如何访问源代码?

时间:2012-10-15 23:57:48

标签: javascript

我得到了一些随机的匿名js函数的JS代码。 我希望代码(例如alert('hello'))转储/警告 它注入的整个脚本块/对象。

有点像document.body.innerHTML但是对于匿名功能块

结果应该是:

Function()({ somecode; MyAlert(...) } )()

Try { some code; mycode; } catch(e) { }

3 个答案:

答案 0 :(得分:3)

  1. 请注意您的条款。 "(浏览器)脚本块"字面意思是脚本元素的代码 by the spec。 使用" javascript块" " javascript对象"表示block object。 不要制造令人困惑的新条款;做阅读和研究。

  2. 块不是对象;他们是语言陈述。 就像你不能"得到当前行的代码/变量",你不能得到当前块的代码/变量" ,尝试阻止或不阻止。

  3. 退一步说,您现在可以使用Function.caller来获取调用代码的功能

  4. 
    
    var mycode = function me(){ if ( me.caller ) alert( me.caller.toString() ); };
    (function(){ var some = 'code'; mycode(); })();
    // Alert "function(){ var some = 'code'; mycode(); }", even when it is anonymous
    
    
    

      

    请注意,您将获得整个函数的代码,而不是功能块的代码,它不包括参数和函数名称。

    1. 以后可能会删除Function.caller ,例如arguments.caller。 (两者都很麻烦。如果调用堆栈上的交叉原点函数包含私有api密钥代码怎么办?js引擎inline你的代码怎么办?)

      当时机成熟时,或当来电者为空时(当它是全局代码时),您仍然可以获得文本堆栈跟踪new Error().stack )和当前脚本元素document.currentScript),但它们的功能非常有限。

      您可以使用textContent或innerHTML属性获取脚本元素的代码(如果有)。

    2. 您的问题听起来像XY Problem。你想做的事情不是现代语言的意思,而是永远不会说出什么目的。 尝试描述您的真实问题。

答案 1 :(得分:1)

函数具有toString()方法。 (是函数有方法!)

var fn = function() { alert('hello') };
fn.toString() // "function() { alert('hello') };"

所以你可以提醒它:

alert(fn.toString());

您可以将其记录到js控制台:

console.log(fn.toString());

甚至可以将其写入页面。

document.getElementById('someID').innerHTML = fn.toString();

但是,这不适用于Universe中的每个函数。

[].push.toString()
"function push() { [native code] }"

某些函数不是用javascript实现的,而是在浏览器或JS引擎的编译代码中实现的。对于这些环境提供的函数,您将获得上述不太有用的输出。

答案 2 :(得分:0)

如果您在严格模式下,则可以使用(非标准).caller

function getFunctionReference(callback) {
    var ref = getFunctionReference.caller;
    if (callback) callback(ref);
    return ref;
}

现在你可以做像

这样的事情
(function () {
    getFunctionReference(alert);
}());
// alerts the .toString of the IIFE

这仅适用于功能,您不能在顶级代码上执行此操作。

探索代码的最佳方法实际上是使用控制台,您可以使用debugger;语句或断点来准确了解发生的情况和时间。