这个章节要来讨论闭包的概念
函式包函式,并且在子函式中调用父函式的变数,避免父函式的变数在没有任何参照的情况下被释放掉。
讲的好像很困难,我们直接来看範例比较快
function storeMoney() { var money = 1000; return function (price) { money = money + price; return money; }}console.log(storeMoney());console.log(storeMoney()(100));
如果是这样的话,下面两个 console.log 会印出甚么呢?
第一个印出的是我们 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
如果重新宣告一个变数,他还可以同时分别累积不同的金额。
很神奇吧!
以上就是闭包的简单介绍,详细的介绍在下一篇文章
希望对各位有帮助,汪汪!