区分闭包和局部变量

时间:2010-02-27 15:31:14

标签: javascript scope closures

闭包中的局部函数声明了一个具有相同名称的变量,该变量存在于闭包中。那么,我们怎么能从本地函数访问closure的变量呢?

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

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

我已编辑完全关闭。无论如何,闭包在这里并没有太多关注,它可以考虑内部函数,但是,可能有某种方式闭包的解决方案。

由于

3 个答案:

答案 0 :(得分:3)

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

如果你使用讨厌的with运算符,你可以通过重新调整当前范围来玩一些技巧,但是(以及arguments的调用者/被调用者的东西)真的只是让你访问对象和具有属性的函数。没有办法说“从这里给我x-a运行范围内的xVar意味着什么”。

答案 1 :(得分:1)

内部范围中定义的变量隐藏外部范围中的变量声明。 “更好,更整洁的解决方案”不是以这种方式重用变量名称。

答案 2 :(得分:0)

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

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