Javascript 进阶 5-4 闭包 Closure

这个章节要来讨论闭包的概念

函式包函式,并且在子函式中调用父函式的变数,避免父函式的变数在没有任何参照的情况下被释放掉。

讲的好像很困难,我们直接来看範例比较快

function storeMoney() {    var money = 1000;    return function (price) {        money = money + price;        return money;    }}console.log(storeMoney());console.log(storeMoney()(100));

如果是这样的话,下面两个 console.log 会印出甚么呢?

http://img2.58codes.com/2024/20121770kQuZdWGARc.png

第一个印出的是我们 return 的匿名函式,也就是说 storeMoney() 变成一个表达式,他回传的值式我们定义的 匿名函式。

而第二个我们再透过(),并传入数字去执行刚刚定义的 匿名函式 执行了 1000 + 传入的数字后,他会再把总和回传回来,所以得到 1100的结果。

这样的状况就称为闭包。

然而闭包还有一个常见的应用如下

function storeMoney() {    var money = 1000;    return function (price) {        money = money + price;        return money;    }}var odinMoney = storeMoney();console.log(odinMoney(100)); // 1100console.log(odinMoney(100)); // 1200console.log(odinMoney(100)); // 1300

会造成这样累加的结果是因为父元素的 money 变数没有消失,一直被子函式给参照着,所以金额就不断地累加上去。

更特别的是下面这个状况

function storeMoney() {    var money = 1000;    return function (price) {        money = money + price;        return money;    }}var odinMoney = storeMoney();console.log(odinMoney(100)); // 1100console.log(odinMoney(100)); // 1200console.log(odinMoney(100)); // 1300var jayMoney = storeMoney();console.log(jayMoney(1000)); // 2000console.log(jayMoney(1000)); // 3000console.log(jayMoney(1000)); // 4000

如果重新宣告一个变数,他还可以同时分别累积不同的金额。

很神奇吧!

以上就是闭包的简单介绍,详细的介绍在下一篇文章

希望对各位有帮助,汪汪!


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章