是否有一种方法可以访问函数父作用域中的变量

时间:2016-07-19 20:34:29

标签: javascript scope closures metaprogramming symbols

鉴于对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,我们发现:

inspection of <code>ref</code>

请注意包含Closurefoo的{​​{1}}对象。如果无法以编程方式获取此闭包对象,那么是否有任何当前提出的ECMAScript标准,例如bar,它可以包含父对象的数组&#34;闭包对象&#34;给定函数?

更新

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

&#13;
&#13;
Symbol.scope
&#13;
&#13;
&#13;

当然,如果提前知道变量名称,并且子范围中存在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'));,则可行,但如果这些条件都不满足会怎么样?

1 个答案:

答案 0 :(得分:2)

  

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

没有

  

是否有任何当前提出的ECMAScript标准,例如ionicBootstrap(MyApp, [], { tabbarPlacement: "bottom" }); ,它可以包含父&#34;闭包对象&#34;给定函数?

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