JavaScript:引用一个函数local scope作为对象

aaa*_*aaa 23 javascript scope

当我调用一个函数时,为该调用建立了一个本地范围.有没有办法直接将该范围作为对象引用?就像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
}
Run Code Online (Sandbox Code Playgroud)

或者,是否有人在自定义变量之上有一个完整的本地范围列表?

背景:我试图从一个函数调用中完全转移到全局范围的方式,with语句是一个笑话,调用工作得更好一点,但它仍然在函数作用域中声明但在全球范围,因此我会在全球范围内宣布这几个案例,但这需要我知道它们是什么.IE函数execScript完全转换,但这只能解决IE的问题.

注意:对于动态加载JavaScript的任何人来说setTimeout(code,1),实现全局范围是一个简单有效的方法,但它不会立即执行.

T.J*_*der 15

没有,有没有办法引用函数的执行上下文的变量对象 绑定对象中的变量环境中的执行上下文(这是什么东西叫做[现在;因此,删除线]详细规范的10.3节) .您只能访问有限的视图arguments(实际上非​​常有限).

通常当我想要这样做时,我只是把我想要的东西放在一个对象上然后使用它(例如,将它传递给一个函数).当然,在上下文中创建的任何函数都可以访问创建它们的范围内的所有内容,因为它们"关闭"上下文; 更多:闭包并不复杂.


Dom*_*ngs 8

我知道这已经很晚了,你可能不再对它有点兴趣了,但我也对它的可行性感兴趣,你应该可以使用以下方法进行某种工作:

(function(global) {
    var testVar = 1;

    global.scope = function(s) {
        return eval(s);
    }
})(this);
Run Code Online (Sandbox Code Playgroud)

然后运行:

scope('testVar'); // 1
Run Code Online (Sandbox Code Playgroud)

从闭包内返回变量.不是特别好,但理论上可以将它包装在一个对象中,如果需要,可能使用一些验证和getter和setter?

编辑:重新阅读问题之后,我假设你想要访问它而不必在范围本身中指定一个函数,所以这可能不适用.无论如何,我会留在这里.

  • 我觉得这太棒了! (3认同)