【发布时间】:2016-11-22 21:48:45
【问题描述】:
给定对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,我们发现:
注意包含foo 和bar 的Closure 对象。如果无法以编程方式获取此闭包对象,是否有任何目前提出的 ECMAScript 标准,例如 Symbol.scope,它可以包含给定函数的父“闭包对象”数组?
更新
为了解决 @Bergi 和 @Oriol 的 cmets,我添加了一些说明。
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,则此方法有效,但如果这两个条件都不满足怎么办?
【问题讨论】:
-
真的没有意义。如果他们打算公开曝光,他们将是
-
@charlietfl 对我来说,这个问题更像是一种智力练习,而不是我打算使用的东西。我只是想知道控制台实用程序用于显示函数引用中的闭包的方法是否可以在 JavaScript 中访问,以及是否有一个标准提案正在制定中以使这成为可能。我认为仅仅基于所谓的变量范围“意图”就说这没有意义是没有道理的,因为无论如何这是一种假设情况。
-
不确定我是否理解,但
ref.sneaky()不起作用? -
@Oriol 没有。我要问的是访问我在屏幕截图中显示的
Closure对象。我目前正在更新我的问题以澄清这一点。 -
@PatrickRoberts 啊,所以你想访问环境记录,对吧?但这是规范的内部问题。实现甚至不需要它们。
标签: javascript scope closures metaprogramming symbols