先看著幾行代碼:
'use strict';function autoInc(init){ let x=init||0; return{ inc:function(){ x+=1; return x; } }}常識:
1 javaScript作用域 是”鏈式作用域”結構(chain scope),子對象會一級一級地向上尋找所有父對象的變量。因此鍵為inc的值:即匿名函數
function(){ x+=1; return x; }中的x會向上尋找父對象autoInc函數對象中的x,找到。
2 autoInc函數對象返回值
對于剛接觸Javascript的小伙伴,很容易發蒙,不知道autoInc的返回值是x,還是匿名函數。其實,autoInc函數對象的返回值是一個對象
{inc: function{...}} //這是JS特有的object類型因此調用autoInc(8)的作用:此函數變量x內部賦值為8,并且返回這么一個對象{inc:function(){…}}
let fun = autoInc(8);3 閉包慎用 調用autoInc(8)完后,變量x在內存中會立即釋放嗎? 不會的。這就是閉包,因為fun對象,inc的鍵值,也就是這個匿名函數,在1中提到了,匿名函數用到了父函數autoInc中的定義的x了。這個匿名函數就是一個閉包。
因此閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在IE中可能導致內存泄露。解決方法是,在退出函數之前,將不使用的局部變量全部刪除。
運用這個閉包:
let num = fun.inc(); //此時調用匿名函數,并且返回一個Number變量,為9為什么為9,因為變量x未在內存中立即釋放,fun.inc()調用前,x的值還是8!
由此看見,調用閉包,改變父函數內部變量x的值。
所以,閉包可以看做是父函數autoInc對象的公用方法(Public Method),內部變量x可以看做是父函數autoInc的私有屬性(PRivate value)。
你們覺得呢?
新聞熱點
疑難解答