是否可以创建一个列出当前范围的所有属性(键)的函数enumerateScope()
?
<script>
var a = "foo";
enumerateScope(); //all properties of global window object including 'a'
</script>
这很简单,但是这个呢?
<script>
(function(){
var b = "bar";
enumerateScope(); //either only 'b' or all properties of global window object including 'b'
})();
</script>
最后一个案例是我感兴趣的。我不想要更改匿名/闭包范围内的任何代码,就像
一样(function(scope){scope.b = "bar";})(window);
有没有办法实现这个目标?
答案 0 :(得分:2)
抱歉,这是不可能的。变量声明创建绑定到当前执行上下文的环境记录,这不是您可以访问的。
有关详细信息,请参阅规范中的"Declaration Binding Instantiation"。
另见execution context部分(重点补充):
执行上下文纯粹是一种规范机制,不需要与ECMAScript实现的任何特定工件相对应。 ECMAScript程序无法访问执行上下文。
答案 1 :(得分:2)
嗯,严格来说,这不是不可能的,请考虑
bindings = function() {
var v = String(bindings.caller).match(/\w+/g).join(" ");
return "('"+v+"'.split(' ').reduce(function($1,$2){try{$1[$2]=eval($2)}finally{return $1}},{}))";
}
vars = (function(){
var b = "bar";
var foo = "quux";
return eval(bindings())
})();
console.log(vars)
//{
// "b": "bar",
// "foo": "quux"
//}
但在大多数情况下我不会称之为实用,除非是出于调试目的。