【问题标题】:Distinguishing closure and local variables区分闭包和局部变量
【发布时间】:2011-01-21 19:33:58
【问题描述】:

闭包中的局部函数声明了一个存在于闭包中的同名变量。那么,我们如何从局部函数中访问闭包的变量呢?

function closure()
{
    var xVar; 
    function func1()
    {
        var xVar;
        // how to distinguish local and closure scopes.
        return xVar;
    }
    return function () { return func1(); };
}

创建一个私有对象并将私有变量作为该对象的属性会有所帮助。但我想知道是否有更好更简洁的解决方案。范围链可以提供帮助吗?

我已对其进行了编辑以使其完全关闭。无论如何,闭包在这里并不重要,它可以考虑用于内部函数但是,可能会有一个解决方案以某种方式使用闭包。

谢谢

【问题讨论】:

    标签: javascript scope closures


    【解决方案1】:

    在您的示例中,xVar 变量不是闭包,因为您将其范围重新定义为每个函数。要将该变量用作闭包,请继续在closure() 函数中使用var 命令声明它,然后不要在func1() 函数中使用var 函数声明它。而是直接在 func1() 中使用变量。

    没有一种简单的方法可以测试函数是闭包还是局部变量。您必须执行某种流控制测试,然后分析分配、分配发生的位置以及分配不发生的位置。然后你必须比较这些结果。您可以用 JavaScript 编写一个工具,对给定的输入执行分析,然后为您编写一份报告作为输出。

    【讨论】:

    • 我想他知道这一点。问题是,如何从“func1”中的代码明确引用“closure”中定义的“xVar”(而不是“func1”中定义的“xVar”)?
    • 我在第一段中回答了这个问题。
    【解决方案2】:

    在内部作用域中定义的变量隐藏在外部作用域中的变量声明。 “更好、更简洁的解决方案”不是那样重用变量名。

    【讨论】:

      【解决方案3】:

      您不能在 JS 中显式访问作用域链。你的问题是变量阴影的古老问题,但它更令人抓狂,因为在 JS 中,作用域链实际上在运行时 there,只是你无法访问它。

      如果您使用讨厌的 with 运算符,您可以通过重新调整当前范围来玩一些技巧,但这(以及 arguments 的调用者/被调用者的东西)实际上只是让您可以访问对象和函数及其属性.没有办法说“从这里给我 xVar 在 n-1 运行时范围内的含义”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-12
        • 2020-11-22
        • 2018-12-24
        • 1970-01-01
        • 2017-02-07
        • 2013-01-06
        • 1970-01-01
        相关资源
        最近更新 更多