为什么我应该考虑在代码中使用JavaScript闭包
Why should I consider the use of JavaScript Closures in my code?
在JavaScript中使用闭包的好处是什么?如果我通常可以写一个更简单、更直接的解决方案,至少在我看来,为什么我应该在代码中考虑它们。
例如,考虑一下:
function multiplier(factor) {
return function(number) {
return number * factor;
};
}
var twice = multiplier(2);
console.log(twice(5));
//////////////////////////////////////////////////////////////////
function myMultiplier(factor, number) {
return number * factor;
}
console.log(myMultiplier(2, 5));
它们都输出10,但我发现myMultipler更容易理解,写得更快,而且我只需要一个函数就可以完成。为什么我要考虑闭包版本而不是我的版本?
提前谢谢。
可能需要闭包的典型场景之一是注册事件处理程序的for
循环。for
循环不会创建新的作用域。这意味着,如果在循环中注册的事件处理程序在循环过程中依赖于局部变量的值,则需要一个闭包来用处理程序包装这些值。
考虑以下两个片段。没有关闭的会导致意想不到的结果。
无闭合
for(var i = 0; i < locations.length; i++){
var marker = new google.maps.Marker(...);
...
google.maps.event.addListener(marker, 'click', function(){
...
// At the time of click the for loop has finished.
// Thus, marker will be the last marker that was created in the loop.
});
}
带封口
for(var i = 0; i < locations.length; i++){
var marker = new google.maps.Marker(...);
...
google.maps.event.addListener(marker, 'click', (function(marker){
return function() {
...
// The marker object is wrapped in the closure and
// will possess the correct value
}
})(marker)); // Pass in marker to make the closure work
}
问题中的代码只演示了"闭包是什么",相当于编写一个"helloworld"应用程序。
闭包不仅允许传递数据,还允许传递逻辑。这增加了代码某些部分的可重用性:
var arr = [81,55,75,5,3,6,95,0,55,-97];
var sorter = function(modifier) {
return function(arr){
arr.sort(modifier);
};
};
var asc = sorter(function(a,b){
return a > b;
});
var desc = sorter(function(a,b){
return a < b;
});
asc(arr);
console.log(arr);
desc(arr);
console.log(arr);
该输出:
[-97, 0, 3, 5, 6, 55, 55, 75, 81, 95]
[95, 81, 75, 55, 55, 6, 5, 3, 0, -97]
请参阅:http://jsfiddle.net/jimschubert/7nnycrfj/
edit:通过添加不同类型的数组,您可以看到可重用性是如何工作的:http://jsfiddle.net/jimschubert/7nnycrfj/1/
如果您可以编写一个更简单、更直接的解决方案,那么就这样做吧。会说javascript或其他什么。
该功能存在并不意味着你应该使用它。如果它符合你的目的,你应该使用。正如您所指出的,在这种情况下不应该使用闭包。
但关闭并非毫无用处。它们是许多编程语言的主要功能。你可以查看任何关于它们的文档,了解它们的有用之处。举个例子。
- for循环中的JavaScript闭包
- Javascript闭包-如何防止内存泄漏
- Javascript.闭包和dynamic'这'实际上具有约束力
- 用于添加两个数字的javascript闭包的用法
- 什么'这个javascript闭包的区别是什么
- 我可以使用JavaScript闭包添加数字吗
- javascript闭包:保护内部变量
- JavaScript闭包&回调函数
- 这些被认为是Javascript闭包吗
- JSHint 错误“对象不支持此属性或方法”用于 javascript 闭包
- JavaScript闭包的效果如何
- JavaScript 闭包和 for 循环
- 在谷歌地图示例中为 Ajax 调用制作一个 JavaScript 闭包
- JavaScript闭包和返回数组元素
- 如何在严格模式下实现以下JavaScript闭包
- 请解释这个Javascript闭包练习
- JavaScript闭包和变量引用
- Javascript闭包覆盖函数表达式
- Javascript闭包错误
- 为什么JavaScript闭包不能与预定义的函数一起使用