4

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

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

结果应该是这样的:

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

或者

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

3 回答 3

3
  1. 注意你的条件。“(浏览器)脚本块”字面意思是 spec的脚本元素的代码。使用“javascript 块”“javascript 对象”来表示 对象。不要创造令人困惑的新术语;阅读和研究。

  2. 块不是对象;它们是语言陈述。就像您无法“获取当前行的代码/变量”一样,您无法“获取当前块的代码/变量”,请尝试是否阻止。

  3. 退后一步,现在您可以使用Function.caller该函数来调用您的代码

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引擎应该如何内联您的代码?)

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

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

  2. 你的问题听起来像一个XY 问题。你想做一些现代语言不应该做的事情,但永远不要说出于什么目的。 试着描述你真正的问题。

于 2015-11-25T03:34:00.340 回答
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();

然而,这并不适用于宇宙中的每一个功能。

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

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

于 2012-10-16T00:04:17.160 回答
0

如果您不是在严格模式下,您可以使用(非标准)从可引用的东西(即命名函数表达式)上上堆栈.caller

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

现在你可以做类似的事情

(function () {
    getFunctionReference(alert);
}());
// alerts the .toString of the IIFE

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


探索代码的最佳方式实际上是使用Console,您可以使用debugger;语句或断点来准确跟踪正在发生的事情和时间。

于 2015-11-25T03:42:10.590 回答