鉴于对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
,我们发现:
请注意包含Closure
和foo
的{{1}}对象。如果无法以编程方式获取此闭包对象,那么是否有任何当前提出的ECMAScript标准,例如bar
,它可以包含父对象的数组"闭包对象"给定函数?
为了解决@Bergi和@Oriol的评论,我添加了一些澄清。
Symbol.scope

当然,如果提前知道变量名称,并且子范围中存在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'));
,则可行,但如果这些条件都不满足会怎么样?
答案 0 :(得分:2)
给定对函数的引用,是否可以以编程方式访问其父作用域中的变量名称和/或值?
没有
是否有任何当前提出的ECMAScript标准,例如
ionicBootstrap(MyApp, [], { tabbarPlacement: "bottom" });
,它可以包含父"闭包对象"给定函数?
没有。如果有,它将永远不会被接受,因为闭包是javacript中唯一真正封装的方法,并且引入这样的访问器将是一个巨大的安全漏洞(对于引用,请参阅http://www.ieee-security.org/TC/SP2011/PAPERS/2011/paper023.pdf或http://web.emn.fr/x-info/sudholt/papers/miss13.pdf )。