Javascript 以文本形式获取周围的JS闭包代码
我试图以文本的形式获取当前范围的周围js代码。这意味着之后它将被嵌入到一个实时编辑器中。可能吗?在最坏的情况下,它可以通过犀牛Javascript 以文本形式获取周围的JS闭包代码,javascript,Javascript,我试图以文本的形式获取当前范围的周围js代码。这意味着之后它将被嵌入到一个实时编辑器中。可能吗?在最坏的情况下,它可以通过犀牛 非常感谢参数对象有一个成员被调用方,该成员引用了当前正在执行的函数: function example(){ console.log(arguments.callee.toString()) } 将输出完整的函数定义。因此,这不仅仅是内部代码,还包括周围的函数(){…}定义。对象的参数有一个成员被调用方,该成员引用当前执行的函数: function examp
非常感谢参数
对象有一个成员被调用方
,该成员引用了当前正在执行的函数:
function example(){
console.log(arguments.callee.toString())
}
将输出完整的函数定义。因此,这不仅仅是内部代码,还包括周围的函数(){…}
定义。对象的参数
有一个成员被调用方
,该成员引用当前执行的函数:
function example(){
console.log(arguments.callee.toString())
}
将输出完整的函数定义。因此,这不仅仅是内部代码,还包括周围的函数(){…}
定义。一般来说,不是。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
将无法通过查看参数来确定它是否被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
在一个上下文中运行,该上下文具有比调用堆栈所建议的更多的可用符号,因为计数器在调用eval
时不在调用堆栈上
Rhino允许访问当前作用域作为一个函数,该函数公开了getIds
方法,该方法可用于枚举当前堆栈帧中的名称,通常,您可以通过getPrototype
进入更高的堆栈帧,不可以。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
将无法通过查看参数来确定它是否被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
在一个上下文中运行,该上下文具有比调用堆栈所建议的更多的可用符号,因为计数器在调用eval
时不在调用堆栈上
Rhino允许访问当前的作用域,它公开了getIds
方法,该方法可用于枚举当前堆栈帧中的名称,并且您可以通过getPrototype
进入更高的堆栈帧。这很可爱,我需要用这种方式玩一下。谢谢<代码>参数。调用者
将再上一层。@ampersand,许多浏览器没有调用者
作为参数
的成员,只是作为函数的成员。在Chrome中,(函数(){return(函数(){return typeof arguments.caller;})(;})()=“undefined”
,但是(函数(){return(函数(){return typeof arguments.callee.caller;})(;)()=“function”
@Mike。如前所述,我对Rhino没有意见,所以它都是预缓存的,不需要在所有浏览器中运行。不过,再次谢谢你。@MikeSamuel,谢谢你指出,arguments.callee.caller
更可靠。这很可爱,我需要用这种方式玩一下。谢谢<代码>参数。调用者
将再上一层。@ampersand,许多浏览器没有调用者
作为参数
的成员,只是作为函数的成员。在Chrome中,(函数(){return(函数(){return typeof arguments.caller;})(;})()=“undefined”
,但是(函数(){return(函数(){return typeof arguments.callee.caller;})(;)()=“function”
@Mike。如前所述,我对Rhino没有意见,所以它都是预缓存的,不需要在所有浏览器中运行。不过,再次感谢。@MikeSamuel,谢谢你指出参数.callee.caller
更可靠。我需要验证一下。ampersand说,它给出了全文。如果不行,我会检查犀牛路。也要感谢您。@mc007,您可能不需要100%的解决方案,但对于递归外部函数,该解决方案将失败。+1。很好的解释和例子。对于我编写和读取的85%的代码,参数。被调用方
和参数。调用方
将起作用。@ampersand,我同意这些通常是可忽略的角情况。我对当前范围没有问题。实际上,我想“标记”一系列代码——当前范围——并在运行中公开它们。因此,基本上,一旦它以这种方式被刮取,它就作为模板进入服务器,可供编辑器自定义。我会尽快检查的,谢谢各位。我需要核实一下。ampersand说,它给出了全文。如果不行,我会检查犀牛路。也要感谢您。@mc007,您可能不需要100%的解决方案,但对于递归外部函数,该解决方案将失败。+1。很好的解释和例子。对于我编写和读取的85%的代码,