获取周围的JS闭包代码作为文本
Getting surrounding JS closure code as text
我试图将当前范围的周围js代码作为文本。这意味着之后会嵌入到实时编辑器中。这可能吗?在最坏的情况下,它可以通过Rhino。
thanks a lot
arguments
对象有一个成员callee
指向当前正在执行的函数:
function example(){
console.log(arguments.callee.toString())
}
将输出完整的函数定义。所以,这不仅仅是内部代码,还包括周围的function(){...}
定义。
一般来说,没有。JavaScript没有提供可靠的方式来内省变量定义或调用堆栈。
只要没有递归调用, arguments.callee
和arguments.caller
确实提供了对调用堆栈上的函数集的内省,因此您可以通过遍历它来提取源代码。但是它可以被
function defeatArgumentsCaller(f, args, called) {
if (!called) { return defeatArgumentsCaller(f, args, true); }
return f.apply(args);
}
function f() {
defeatArgumentsCaller(g, []);
}
当f
被调用时,g
将无法通过查看arguments.caller
来确定它是由f
调用的。
function g() {
var fn = arguments.callee;
while (true) {
alert(fn.name);
var caller = fn.caller;
// defaultArgumentsCaller is itself, not f.
if (!caller || caller == fn) { break; }
fn = caller;
}
}
它们不允许对已定义的符号集进行自省,例如通过with
或catch
引入的符号,因此任何试图枚举...
中可用的局部变量的尝试
function f(o) {
try {
throw null;
} catch (e) {
with (o) {
...
}
}
}
通过检查调用堆栈和函数源代码将错过一些已定义的符号。
调用堆栈也不同于闭包堆栈。例如,在
function counter() {
var n;
return function (f) { return f(n++); };
}
counter()(eval);
eval
运行在一个具有比调用堆栈更多的可用符号的上下文中,因为counter
在调用eval
时不在调用堆栈上。
Rhino允许作为Scriptable
访问当前作用域,这暴露了getIds
方法,该方法可用于枚举当前堆栈帧中的名称,并且您可以通过getPrototype
走到更高的堆栈帧。
相关文章:
- d3js文本传输-示例代码不起作用
- 用于用户内容的简单代码编辑器/文本格式化程序(在Rails中)
- 使用.format在一些HTML代码中插入文本,会出现错误(Python)
- html代码需要可点击的文本按钮
- 使用Javascript代码在文本框上激发退格事件
- 用js代码重新定位文本
- 通过从文本区域获取代码,在画布中运行处理代码
- html或java脚本代码在硬盘中创建一个文本文件
- 用于更改链接文本的字体颜色的代码
- 在Asp.net的TextBox中插入所需文本的java脚本代码
- php代码或脚本接受自动完成列表中文本框中的值
- 使用 jQuery 检查文本可见性 .包含代码的行为不符合预期
- 修复Javascript代码以将文本中的所有Youtube链接转换为Youtube ID功能
- 从一个文本框执行代码,并在另一个文本框中以 HTML 显示输出
- MVC 4:使用 JQUERY 和 PartViewResult 动态创建 HTML 文本框.如果代码是动态添加的,如何
- jQuery文本属性中的Html代码
- 在我用javascript更改后,标签文本在代码后面没有更改
- 如何从此代码笔中删除数字和秒文本
- 文本区域内的漂亮代码
- 将jQuery节点转义为文本,以便HTML代码可见