我得到了一些随机的匿名js函数的JS代码。
我希望代码(例如alert('hello')
)转储/警告
它注入的整个脚本块/对象。
有点像document.body.innerHTML但是对于匿名功能块
结果应该是:
Function()({ somecode; MyAlert(...) } )()
或
Try { some code; mycode; } catch(e) { }
答案 0 :(得分:3)
请注意您的条款。 "(浏览器)脚本块"字面意思是脚本元素的代码 by the spec。 使用" javascript块" 或 " javascript对象"表示block 或 object。 不要制造令人困惑的新条款;做阅读和研究。
块不是对象;他们是语言陈述。 就像你不能"得到当前行的代码/变量",你不能得到当前块的代码/变量" ,尝试阻止或不阻止。
退一步说,您现在可以使用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

请注意,您将获得整个函数的代码,而不是功能块的代码,它不包括参数和函数名称。
以后可能会删除Function.caller ,例如arguments.caller
。 (两者都很麻烦。如果调用堆栈上的交叉原点函数包含私有api密钥代码怎么办?js引擎inline你的代码怎么办?)
当时机成熟时,或当来电者为空时(当它是全局代码时),您仍然可以获得文本堆栈跟踪(new Error().stack
)和当前脚本元素(document.currentScript
),但它们的功能非常有限。
您可以使用textContent或innerHTML属性获取脚本元素的代码(如果有)。
您的问题听起来像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;
语句或断点来准确了解发生的情况和时间。