为什么我应该考虑在代码中使用JavaScript闭包? 在JavaScript中使用闭包有什么好处,如果我通常可以编写一个更简单和直接的解决方案,至少在我看来,为什么我应该把它们放在代码中? 例如,考虑这一点: function multiplier(factor) { return function(number) { return number * factor; }; } var twice = multiplier(2); console.log(twice(5));

为什么我应该考虑在代码中使用JavaScript闭包? 在JavaScript中使用闭包有什么好处,如果我通常可以编写一个更简单和直接的解决方案,至少在我看来,为什么我应该把它们放在代码中? 例如,考虑这一点: function multiplier(factor) { return function(number) { return number * factor; }; } var twice = multiplier(2); console.log(twice(5));,javascript,web,Javascript,Web,////////////////////////////////////////////////////////////////// function myMultiplier(factor, number) { return number * factor; } console.log(myMultiplier(2, 5)); 它们都输出10,但我发现myMultipler更容易理解,编写速度更快,而且我只需要一个函数就可以完成。为什么我要考虑

//////////////////////////////////////////////////////////////////

    function myMultiplier(factor, number) {
         return number * factor;
     }

    console.log(myMultiplier(2, 5)); 
它们都输出10,但我发现myMultipler更容易理解,编写速度更快,而且我只需要一个函数就可以完成。为什么我要考虑关闭版本在我的版本?< /P>
提前感谢。

如果你能写出一个更简单、更直接的解决方案,就这样做吧。说javascript或者说别的什么

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


但关闭并不是毫无用处的。它们是许多编程语言的主要特性。您可以查看有关它们的任何文档,以了解它们的用途

您可能需要闭包的典型场景之一是注册事件处理程序的循环的
for
循环不会创建新范围。这意味着,如果在循环中注册了一个事件处理程序,该事件处理程序在循环过程中依赖于局部变量的值,则需要一个闭包来用处理程序包装这些值

考虑以下两个片段。没有关闭的将导致意外的结果

无休止
for(变量i=0;i
结束
for(变量i=0;i
您问题中的代码只演示了“闭包是什么”,相当于编写一个“hello world”应用程序

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

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);
见:


编辑:您可以通过添加不同类型的数组来了解可重用性的工作原理:

在这种情况下,没有理由。不,您不需要使用火焰喷射器来点燃香烟。想象一下,在t0时,您只知道系数,而在t1时,您只知道数字。在您的示例中,这是我现在能想到的唯一一个用例闭包是没有用的。闭包允许不污染全局名称空间的持久变量。你可以多次调用一个函数,它会“记住”以前的代码。我总是觉得这样的代码很难理解,但可能只是因为我只是在学习这些东西……这被认为是函数编程。你可以在这里读到:这似乎是一个很好的理由。
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
}
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]