英文原文
createAdder(x) is a function that returns a function. In JavaScript, functions are first-class objects: they can be passed to other functions as arguments and returned from functions as well. In this case, the function returned is itself a function that takes an argument and adds something to it.
Here’s the magic: the function returned by createAdder() is a closure. It “remembers” the environment in which it was created. If you pass createAdder the integer 3, you get back a function that will add 3 to its argument. If you pass 4, you get back a function that adds 4. The addThree and addFour functions in the above example are created in this way.
Let’s take another look at the addLoadEvent function. It takes as its argument a callback function which you wish to be executed once the page has loaded. There follow two cases: in the first case, window.onload does not already have a function assigned to it, so the function simply assigns the callback to window.onload. The second case is where the closure comes in: window.onload has already had something assigned to it. This previously assigned function is first saved in a variable called oldonload. Then a brand new function is created which first executes oldonload, then executes the new callback function. This new function is assigned to window.onload. Thanks to the magical property of closures, it will “remember” what the initial onload function was. Further more, you can call the addLoadEvent function multiple times with different arguments and it will build up a chain of functions, making sure that everything will be executed when the page loads no matter how many callbacks you have added.
Closures are a very powerful language feature but can take some getting used to. This article on Wikipedia provides more in-depth coverage.
中文翻译:有更好的可以留言。大体意思差不多了 createAdder(x)是一个函数,返回一个函数。在JavaScript中,函数是第一类对象:另外它们可以被传递到其他函数作为参数和函数返回。在这种情况下,函数返回本身就是一个函数接受一个参数,并增加了一些东西。
在这里,Äôs the magic:由createAdder返回函数()是一个闭包。它,Äúremembers,非盟在创建它的环境。如果传递createAdder整数3,你回来一个函数,将增加3至其参数。如果你通过四,你回来一个函数,增加了4。该addThree在上面的例子addFour职能创造这样的。
让,星光大道可以再一次看看addLoadEvent功能。这需要将执行一次页面已加载为一个回调函数的参数,你的愿望。有下列两种情况:在第一种情况,在window.onload已经没有分配给它一个函数,因此函数简单的回调在window.onload分配。第二个案例是在关闭的时候:在window.onload已经有分配给它的东西。这是以前分配的功能首次在一个名为oldonload变量保存。然后,一个全新的功能是创建的第一个执行oldonload,然后执行新的回调函数。这一新功能被分配在window.onload。神奇的封锁财产感谢,它会Äúremember,非盟最初的onload什么功能。进一步,你可以调用函数的addLoadEvent多次与不同的参数,它会建立一个职能链,确保一切都将在页面加载时执行,不管你有多少回调增加。
闭包是一个非常强大的语言功能,但可能需要一些时间来适应。这种对维基百科的文章提供了更深入的报道。
核心代码
function createAdder(x) {
return function(y) {
return y + x;
}
}
addThree = createAdder(3);
addFour = createAdder(4);
document.write('10 + 3 is ' + addThree(10) + '
');
document.write('10 + 4 is ' + addFour(10));
document.write('-10 + 4 is ' + addFour(-10));
演示代码: