为什么我应该考虑在代码中使用JavaScript闭包

Why should I consider the use of JavaScript Closures in my code?

本文关键字:JavaScript 闭包 代码 我应该 为什么      更新时间:2023-09-26

在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或其他什么。

该功能存在并不意味着你应该使用它。如果它符合你的目的,你应该使用。正如您所指出的,在这种情况下不应该使用闭包。

但关闭并非毫无用处。它们是许多编程语言的主要功能。你可以查看任何关于它们的文档,了解它们的有用之处。举个例子。