Javascript 区分闭包和局部变量

Javascript 区分闭包和局部变量,javascript,scope,closures,Javascript,Scope,Closures,闭包中的局部函数声明了一个与闭包中存在的变量同名的变量。那么,我们如何从局部函数访问闭包的变量呢 function closure() { var xVar; function func1() { var xVar; // how to distinguish local and closure scopes. return xVar; } return function () { return func1

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

function closure()
{
    var xVar; 
    function func1()
    {
        var xVar;
        // how to distinguish local and closure scopes.
        return xVar;
    }
    return function () { return func1(); };
}
创建私有对象并将私有变量作为该对象的属性可能会有所帮助。但我想知道是否有更好、更简洁的解决方案。范围链能帮上忙吗

我已经编辑,使它成为一个完整的结束。无论如何,闭包在这里并不是很重要,它可以被考虑用于内部函数,然而,闭包可能会有一个解决方案


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


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

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

您不能在JS中显式访问范围链。你的问题是一个由来已久的变量阴影问题,但它更令人恼火,因为在JS中,作用域链实际上在运行时就在那里,你无法访问它


如果使用带运算符的可以重新调整当前作用域,但这(以及参数的调用者/被调用者内容)实际上只允许您访问具有其属性的对象和函数。没有办法说“从这里告诉我xVar在n-1运行时范围中的含义”。

我想他知道这一点。问题是,从“func1”中的代码中,您如何明确地引用“closure”中定义的“xVar”(而不是“func1”中定义的“xVar”)?我在第一段中回答了这个问题。