2010-02-27 55 views
6

闭包中的本地函数声明闭包中存在的具有相同名称的变量。那么,我们如何才能从本地函数访问闭包变量呢?区分闭包和局部变量

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

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

我已编辑完成关闭。无论如何,封闭在这里并不太受关注,但它可以被认为是内部功能,但是可能会有某种解决方案。

感谢

回答

3

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

你可以玩一些技巧与如果使用讨厌with操作rejiggering电流范围,但(以及arguments的主叫/被叫的东西),实际上只是给你访问对象和函数以及它们的属性。没有办法说“从这里给我n-1运行时范围内的xVar意味着什么”。

0

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

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

+3

我认为他知道这一点。问题是,从“func1”中的代码中,你将如何显式引用在“closure”中定义的“xVar”(而不是“func1”中定义的“xVar”)? – Pointy 2010-02-27 15:37:24

+0

我在第一段中回答了这个问题。 – 2010-02-27 15:58:57

1

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