9

我已经浏览了关于 SO 的所有其他(优秀)答案(尤其是这个:JavaScript 闭包如何工作?),但我希望得到您对我对这个概念的理解的反馈。

我知道一个用例是对公共访问隐藏私有方法的实现。

我想到的另一个是将它用作工厂生成器:

<script>

function carFactory( make ) {

    var m = make;
    return { manufacture: function ( model ) 

        {console.log("A " + m + " " + model + " has been created");}

    }
}

toyotaFactory = carFactory("toyota");
hondaFactory = carFactory("honda");

toyotaFactory.manufacture("corolla");
toyotaFactory.manufacture("corolla");
hondaFactory.manufacture("civic");

</script>

这输出:

A toyota corolla has been create
A toyota corolla has been created
A honda civic has been created 

那么你认为它是闭包的有效用例(即使用相同的代码库创建多个工厂)吗?或者我可以使用更好的东西来实现同样的目标吗?

请注意,问题不是关于闭包的技术实现,而是更多关于应用程序设计/开发中的有效用例。

谢谢。

4

4 回答 4

4

是的,保持变量私有是闭包的有效用途。它允许您对变量进行私有访问,而无需使其成为公共成员。

有关其他示例,请参阅此参考:http ://www.crockford.com/javascript/private.html

于 2012-07-16T00:30:44.713 回答
1

如果我正确理解了您的问题,您是否不关心将make财产保密?如果是这种情况,那么闭包就不是必需的了,您可以使用原型实现相同的功能......

function carFactory(model){
  this.m = make;
}

carFactory.prototype.manufacture = function(model){
  console.log('A ' + this.m + ' ' + model + ' has been created');
}

根据这个问题,这具有相关的性能优势(减少内存和提高速度) 。

于 2012-07-16T00:39:15.970 回答
0

闭包是非常强大的构造,有很多有用的用途。您在那里使用的那个实际上是一种“黑客”。闭包最常见的用途是,当您实现了一些在中间“做某事”的功能时......并且“做某事”可以或多或少地配置为您想要的任何东西......例如 jQuery ajax 功能当请求出现错误或成功等时可以“做某事”......如果你没有闭包,你只能传递一个“静态定义”的函数,这可能需要收集上下文需要从全局变量中执行您希望它执行的任何操作,或者您必须对所有函数使用相同的签名,就像它在 C 或 C++ 中所做的那样 function (customData) {} ...

因此,每当您必须在某物内部“配置”某些自定义功能时,您将使用闭包......

于 2012-07-16T00:38:01.180 回答
0

我试图想出一个信息隐藏/封装的实际例子,这就是我迄今为止的尝试

'use strict';

const bank = (accountHolderName, initialDeposit) => {
    let balance = initialDeposit;
    const add = (amount) => {
        balance += amount;
    }

    let subtract = (amount) => {
        balance -= amount
    }

    let printBalance = () => {
        console.log(accountHolderName, "has balance of", balance, "dollars");
    }

    return {
        credit: add,
        debit: subtract,
        balance: printBalance
    }
}

let amy = bank("Amy", 1000);
amy.balance();
amy.credit(100);
amy.balance();
amy.debit(10);
amy.balance();

let sam = bank("Sam", 50);
sam.balance();
sam.credit(50);
sam.balance();
sam.debit(100);
sam.balance();

运行后,您将获得以下输出

Amy has balance of 1000 dollars
Amy has balance of 1100 dollars
Amy has balance of 1090 dollars
Sam has balance of 50 dollars
Sam has balance of 100 dollars
Sam has balance of 0 dollars

好处?

  • balance变量不可直接访问。
  • 使用闭包,每个调用者都可以获得自己的数据。艾米balance没有干扰Sam's数据
  • 调用者(AmySam和其他人)有一个很好的 API 可以使用,而不用担心如何bank操作的内部细节。

我还缺少其他东西吗?

于 2019-09-03T23:11:38.857 回答