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

时间:2014-08-30 14:56:45

标签: javascript web

在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更容易理解,编写更快,我只需要一个函数来完成它。为什么我应该考虑关闭版本而不是my-version?

提前致谢。

3 个答案:

答案 0 :(得分:3)

您可能需要关闭的典型方案之一是注册事件处理程序的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
}

答案 1 :(得分:2)

您问题中的代码仅演示“闭包是什么”,相当于编写'hello world'应用程序。

Closures允许您不仅传递数据,还传递逻辑。这增加了代码某些部分的可重用性:

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/

编辑:您可以通过添加不同类型的数组来查看可重用性的工作原理:http://jsfiddle.net/jimschubert/7nnycrfj/1/

答案 2 :(得分:-3)

如果您可以编写更简单直接的解决方案,那就这样做吧。说javascript或说什么。

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

但闭包并非毫无用处。它们是许多编程语言的主要特性。您可以查看有关它们的任何文档以获取它们有用的内容。 Here for example.