当我调用一个函数时,为该调用建立了一个本地范围。有没有办法直接将该范围作为对象引用?就像window是全局范围对象的引用一样。
示例:
function test(foo){
var bar=1
//Now, can I access the object containing foo, bar, arguments and anything
//else within the local scope like this:
magicIdentifier.bar
}
或者,是否有人在自定义变量之上有一个完整的本地范围列表?
背景:我试图从一个函数调用中找到一种完全转移到全局范围的方法,with语句是一个笑话,调用工作得更好一些,但它仍然会在函数范围内声明的内容中断但不是在全球范围内,因此我会在全球范围内宣布这些案例,但这需要我知道它们是什么。 IE函数execScript完全转换,但这只能解决IE的问题。
注意:对于动态加载JavaScript的任何人来说,setTimeout(code,1)
是实现全局范围的简单有效的黑客攻击,但它不会立即执行。
答案 0 :(得分:15)
不,没有办法引用变量环境的函数 绑定对象的执行上下文的变量对象em>执行上下文(这就是所谓的[现在;因此删除线]; §10.3 of the specification中的详细信息。您只能通过arguments
访问有限的视图(实际上非常有限)。
通常当我想要这样做时,我只是把我想要的东西放在一个对象上,然后使用它(例如,将它传递给一个函数)。当然,在上下文中创建的任何函数都可以访问创建它们的范围内的所有内容,因为它们“关闭”上下文;更多:Closures are not complicated。
答案 1 :(得分:8)
我知道这已经很晚了,你可能不再对它有点兴趣,但我对这种可行性感兴趣,你应该可以使用以下方法进行某种工作:
(function(global) {
var testVar = 1;
global.scope = function(s) {
return eval(s);
}
})(this);
然后运行:
scope('testVar'); // 1
从闭包内返回变量。不是特别好,但理论上可以将它包装在一个对象中,如果需要,可能使用一些验证和getter和setter?
编辑:重新阅读问题之后,我假设你想要访问它而不必在范围本身中指定一个函数,所以这可能不适用。无论如何,我会留在这里。
答案 2 :(得分:1)
某些版本的Netscape在arguments
对象中有一个魔术属性,可以满足您的需求。 (我不记得它叫什么了)
答案 3 :(得分:0)
这样的事情怎么样?
<script type="text/javascript">
var test = {
bar : 1,
foo : function () {
alert(this.bar);
}
}
test.foo();
</script>
答案 4 :(得分:0)
如果要将函数的范围转移到任何对象,可以使用带有_.bind的下划线库
在您的情况下:
var fn = _.bind(function(){
console.log(this == window)
},window)
fn() // true
答案 5 :(得分:-3)
您不需要关键字来引用本地范围中的变量,因为它是您所在的范围。