2011-04-26 166 views
4

闭包是 函数的局部变量 - 在 函数返回后保持活动状态。关闭JS闭包

我正在围绕着JS & jQuery Closures。根据上面的定义,我的理解是闭包允许访问函数之外的变量,而不需要创建全局变量,从而消除了固有风险。我的解释是否正确?

一如既往地多谢。

回答

4

通常你会认为,当你定义一个函数foo唯一可能的变量,它可以读/写你定义你传递给函数时,它被称为foo(1, "hello");的参数和所有的global变量。这就是C语言的工作原理。

的JavaScript然而,你可以定义一个函数几乎任何地方比全球和参数变量和其他功能还可以在其父作用域读/写变量;例如:

var global = "global"; 
function foo() { 
    var one = 1; 
    function bar() { 
     var two = 2; 
     function argh() { 
     } 
    } 
} 

功能argh将能够读取/所有其父作用域写变量,在这种情况下twooneglobal都对功能argh访问。

我希望这能更好地解释闭包的含义 - 一旦你在JavaSript的工作范围内工作,这并不难。闭包基本上只是能够访问当前和父级范围的内部函数...... :)。

这是一个相当强大的概念,特别是当你在做异步的事情。想象一下,自己有定义将在不同的时刻运行的函数:

// the function we defined below 
// will run in 5 seconds in time 
setTimeout(function(){ 

}, 5000); 

没有的JavaScript函数来访问父范围,我们只能够访问全球变量的能力。但是用JavaScript这是很容易,我们可以使用所有可用的本地变量:

var foo = "some local variable"; 
setTimeout(function(){ 
    alert(foo); 
}, 5000); 
1

技术上是的。实际上不,它们要复杂得多,而且你用这个语法来描述它们的事实表明你对这个概念的理解很差。在您访问了Robert Harvey的链接后,我会回到引用的来源。

+0

同样值得一读[道格拉斯克罗克福德的文章](http://javascript.crockford.com/) – NT3RP 2011-04-26 16:29:35

+0

谢谢,我会继续我的研究。 – Wasabi 2011-04-28 04:30:39

0

下面是一个使用闭包的一个很好的例子:

function makeAddFunction(number1){ 
    function add(number2){ 
     return number1 + number2; 
    } 
    return add; 
} 

var add2 = makeAddFunction(2); 
var add5 = makeAddFunction(5); 
console.log(add2(2)); //Will print 4 to the console 
console.log(add5(2)); //Will print 7 to the console 
console.log(add2(1)); //Will print 3 to the console 

我发现,最好的办法理解这概念就是说,当你调用makeAddFunction()并且在这种情况下将它存储在变量add2中时,你正在拍摄外部函数数据/状态的快照。然后当你调用你的新函数add2()时,你正在访问那些数据以及传递给add2()作为参数的数据。新的参数在函数返回后死亡,但原始快照仍在那里用新的参数再次调用。