枚举JS中当前作用域的所有属性

时间:2013-06-28 12:37:37

标签: javascript scope

是否可以创建一个列出当前范围的所有属性(键)的函数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);

有没有办法实现这个目标?

2 个答案:

答案 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"
//}

但在大多数情况下我不会称之为实用,除非是出于调试目的。