我有一个功能,例如
var test = function () {alert(1);}
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得这个功能的主体?
我假设唯一的方法是解析test.toString()方法的结果,但还有其他方法吗?如果解析是唯一的方法,那么正则表达式将是什么?(极端需要帮助正则表达式,因为我不熟悉它们)
pol*_*nts 45
IF(!!!)你可以得到toString(),然后你可以简单地从第一个indexOf("{")到子串lastIndexOf("}").所以,像这样的"工作"(如ideone.com上所见):
var test = function () {alert(1);}
var entire = test.toString(); // this part may fail!
var body = entire.substring(entire.indexOf("{") + 1, entire.lastIndexOf("}"));
print(body); // "alert(1);"
Run Code Online (Sandbox Code Playgroud)
gbl*_*zex 11
2015年更新
在重新审视函数反编译状态时,可以说它在某些经过深思熟虑的用例和环境中通常是安全的(例如:具有用户定义函数的Node.js worker).
它应该与eval放在同一个桶中,eval是一个功能强大的工具,但它应该只在极少数情况下使用.三思而后行,这是我唯一的建议.
Kangax新研究的结论:
"函数反编译" - 获取Function对象的字符串表示的过程.
通常建议使用函数反编译,因为它是 语言的非标准部分,因此导致代码不可互操作且可能 容易出错.
comp.lang.javascript上的 @kangax
如果你只想执行函数的主体(例如使用eval或使用WorkerAPI),你可以简单地添加一些代码来规避提取函数体的所有陷阱(正如其他人所提到的那样,这是个坏主意)一般来说):
'(' + myFunction + ')()';
Run Code Online (Sandbox Code Playgroud)
我在这个Worker相关的JSFiddle中使用这个技巧.
我还写了一个更完整的库,可以:
请注意,大部分代码都会确保我们获得准确的堆栈跟踪,无论我们在以后执行序列化函数的哪个位置.
这个小提琴演示了该逻辑的简化版本:
JSON.stringify正确序列化功能(即派上用场的时候,例如,我们希望把它更大的系列化"数据包"的一部分).eval以取消转换"JSON-ish"-escaped字符串(JSON不允许函数+代码,所以我们必须使用eval),然后在另一个eval中取回我们想要的对象.//# sourceMappingURL(或旧版本//@ sourceMappingURL)在stacktrace中显示正确的函数名称.Codebuilder使用stacktracejs来修复它.我使用CodeBuilder我的(现在稍微过时)RPC库中的东西,你可以在其中找到一些如何使用它的例子:
| 归档时间: |
|
| 查看次数: |
21718 次 |
| 最近记录: |