Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 以文本形式获取周围的JS闭包代码_Javascript - Fatal编程技术网

Javascript 以文本形式获取周围的JS闭包代码

Javascript 以文本形式获取周围的JS闭包代码,javascript,Javascript,我试图以文本的形式获取当前范围的周围js代码。这意味着之后它将被嵌入到一个实时编辑器中。可能吗?在最坏的情况下,它可以通过犀牛 非常感谢参数对象有一个成员被调用方,该成员引用了当前正在执行的函数: function example(){ console.log(arguments.callee.toString()) } 将输出完整的函数定义。因此,这不仅仅是内部代码,还包括周围的函数(){…}定义。对象的参数有一个成员被调用方,该成员引用当前执行的函数: function examp

我试图以文本的形式获取当前范围的周围js代码。这意味着之后它将被嵌入到一个实时编辑器中。可能吗?在最坏的情况下,它可以通过犀牛


非常感谢参数
对象有一个成员
被调用方
,该成员引用了当前正在执行的函数:

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%的代码,