2

是否可以创建一个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);

有什么办法可以做到这一点?

4

2 回答 2

2

抱歉,这是不可能的。变量声明创建到当前执行上下文的环境记录的绑定,这不是您可以访问的。

有关详细信息,请参阅规范中的“声明绑定实例化”

另请参阅执行上下文部分(已添加重点):

执行上下文纯粹是一种规范机制,不需要对应于 ECMAScript 实现的任何特定工件。ECMAScript 程序不可能访问执行上下文

于 2013-06-28T12:42:37.427 回答
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"
//}

但在大多数情况下,我认为它并不实用,除非可能是出于调试目的。

于 2013-06-28T13:33:32.603 回答