给定对function的引用,是否可以在其父作用域中访问变量名称和/或值?例如:



let ref = (function myClosure() {
  const foo = 'foo';
  const bar = 'bar';

  return {
    sneaky() {
      // use the variables somehow
      // since some browsers optimize functions
      // by omitting parent scopes from the context
      // that are not used
      console.log(foo, bar);
    }
  };
}());

// given `ref.sneaky` in this scope, how to access the scope in `myClosure`?
console.log(ref);





在开发者控制台中检查ref,我们发现:

javascript - 有没有一种方法可以访问函数的父作用域中的变量-LMLPHP

注意包含Closurefoobar对象。如果不可能以编程方式获取此关闭对象,那么是否存在任何当前建议的ECMAScript标准,例如Symbol.scope,其中可能包含给定函数的父“关闭对象”的数组?

更新资料

为了解决@Bergi和@Oriol的评论,我添加一些说明。



let ref = (function myClosure() {
  const foo = 'foo';
  const bar = 'bar';

  return {
    sneaky(...variableNames) {
      // use the variables somehow
      // since some browsers optimize functions
      // by omitting parent scopes from the context
      // that are not used
      console.log(foo, bar);

      return Object.assign(...variableNames.map(variableName => ({
          [variableName]: eval(variableName)
        })
      ));
    }
  };
}());

// given `ref.sneaky` in this scope, how to access the scope in `myClosure`?
console.log(ref.sneaky('foo', 'bar'));





当然,如果提前知道变量名,并且子范围中存在eval,这将起作用,但是如果这两个条件都不满足怎么办?

最佳答案

给定对函数的引用,是否可以以编程方式访问其父作用域中的变量名称和/或值?


没有。


  目前是否有任何建议的ECMAScript标准,例如Symbol.scope,可以包含给定函数的父级“关闭对象”数组?


不会。如果存在,它将永远不会被接受,因为闭包是Javacript中真正封装的唯一方法,而引入这样的访问器将是一个巨大的安全漏洞(有关参考,请参见http://www.ieee-security.org/TC/SP2011/PAPERS/2011/paper023.pdfhttp://web.emn.fr/x-info/sudholt/papers/miss13.pdf)。

关于javascript - 有没有一种方法可以访问函数的父作用域中的变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38468023/

10-12 21:01