JavaScript:将函数局部作用域作为对象引用

IT技术 javascript scope
2021-02-26 08:49:26

当我调用一个函数时,会为该调用建立一个本地作用域。有没有办法直接将该范围作为对象引用?就像 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)是一个实现全局作用域的简单有效的 hack,但它不会立即执行。

5个回答

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

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

哇,这些规范读起来真的很痛苦。无论如何,据我所知,他们似乎表明除了参数和定义的局部变量之外唯一的局部变量是参数和长度。那应该让我动起来,谢谢。我正在构建一个库,我创建的第一个函数是 setInterval 的一致版本,这就是它的用途。当你提供了一个闪亮的抽象界面时,一切似乎变得更加复杂。
2021-04-27 08:49:26
@eBusiness:是的,是的。:-) 不要忘记在函数中声明的任何命名函数,它们也是作用域内的符号。
2021-05-13 08:49:26

我知道这已经很晚了,您可能甚至不再感兴趣,但我也对它的可行性感兴趣,您应该能够使用以下方法解决某种问题:

(function(global) {
    var testVar = 1;

    global.scope = function(s) {
        return eval(s);
    }
})(this);

然后运行:

scope('testVar'); // 1

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

编辑:重新阅读问题后,我假设您希望访问它而无需在范围本身中指定函数,因此这可能不适用。反正我会把这个留在这里。

我觉得这太棒了!
2021-05-05 08:49:26

某些版本的 Netscape 在arguments对象中具有魔法属性,可以执行您要查找的操作。(不记得叫什么了)

它可能仍然存在于 Firefox 中。然而,你是对的;这实际上对您没有帮助。
2021-04-24 08:49:26
arguments 是一个变量,包含传递给当前函数的所有参数。
2021-04-27 08:49:26
@nickf:我意识到这一点。在某些版本的 Netscape 中,它有一个特殊的属性来引用变量作用域。
2021-04-27 08:49:26
@nickf:我一开始也误读了它,但是知道 SLaks 我又读了一遍,明白了他的意思。:-)
2021-05-08 08:49:26
有趣,但恐怕“某些版本的 Netscape”中可用的内容在现代 Web 开发中不起作用;-)
2021-05-12 08:49:26

像这样的事情怎么办?

<script type="text/javascript">
    var test =  {
        bar : 1,
        foo : function () {
            alert(this.bar);
        }
    }

    test.foo();
</script>
如果我的目标只是编写奇怪的代码,那将是一个不错的解决方案:-)
2021-05-03 08:49:26
哈哈。我不明白这有多奇怪,因为您只是创建了一个简单的类结构。
2021-05-05 08:49:26

您不需要关键字来引用局部作用域中的变量,因为它是您所在的作用域

@Rolf 我必须恭敬地不同意。对我来说,这不是 JS-y。这样的对象也是不必要的。当你真的、真的需要动态访问一个变量——而且你真的、真的确定你不应该使用{}(一个专用对象)时——总是eval可以回退到的。
2021-04-28 08:49:26
没有引用局部变量的对象对我来说听起来是 Un-Javascriptic。我不需要它,但我希望它存在,JavaScript 似乎几乎所有东西都有对象,而且都是关于对象的。
2021-04-29 08:49:26
迭代当前作用域中存在的每个变量?对我来说,这听起来不像 Javascriptic(或者“Pythonic”这个词的任何 Javascript 类比)。
2021-05-07 08:49:26