延長函式環境的生命週期(閉包)

2021-10-09 09:33:43 字數 1627 閱讀 2896

當我們只呼叫函式時:

function hd()

sum();

} hd();//2

hd();//2

從上面例子我們可以知道,單純的呼叫的話,這個函式是會在記憶體裡直接刪除的。因為沒有變數去指向它,這樣會導致js內部覺得你不需要了。無論是全域性還是區域性,都會被刪除

而當我們用變數去引用它,即有指標指向它的時候,他就不會被清除。但是我們每呼叫一次hd1()函式給乙個新的變數,都會開闢乙個新的記憶體空間,所以裡面的值又是剛開始新的那乙個n = 1。

function hd1()

sum();

} let tem1 = hd1();//此時為執行了hd1函式,返回了sum函式給了tem1

tem1();//2

tem1();//3

tem1();//4

let tem2 = hd1();//此時是新開闢了乙個記憶體空間,n的起始值還是1

tem2();//2

tem2();//3

tem1();//5

還有乙個細節就是賦值時要return sum函式,如果不return,那麼tem1,tem2就不是指向的sum函式,那麼就還是會被銷毀。如果指向了sum函式,那麼其父級的變數那些都會被保留,類似於這樣

理解為子作用域也可以呼叫父作用域的內容

再加深下理解:

function hd1()

show();

}sum();

} let tem1 = hd1();//8

tem1();//8

tem1();//8

tem1();//8

此時我們發現我們建立了乙個show方法,但是跟之前一樣,使用完show方法後自動銷毀了。這是因為此時沒有指向show方法的物件,沒有引用他,沒有保留show方法的記憶體空間而此時我們再像

function hd1()

show();

}sum();

} let tem1 = hd1()();//此時時執行了sum函式,執行了之後返回了show()函式

tem1();//8

tem1();//9

tem1();//10

let tem2 = hd1()();//此時是新開闢了乙個記憶體空間,m的起始值還是7m

tem2();//8

tem2();//9

tem1();//11

此時的環境是這樣的

在show函式裡呼叫hd的n也是毫無問題的。就算++也會保留++,就跟上文說的,子環境被保留了,父環境的變數哪些,也會被保留

而當我們使用建構函式時,其實跟上面的結果也是一樣的,不同的是不用return sum函式了

function hd()

} console.log(new hd());

let tem4 = new hd();

tem4.sum();//4

tem4.sum();//5

EDM郵件營銷使用者生命週期延長措施

不管是挖掘新客戶還是維護老客戶,edm郵件營銷都是非常有效而可靠的客戶溝通方式,使用者對公司或品牌都有生命週期規律可遵循,下面幫助大家學習如何借助edm郵件營銷使用者生命週期延長措施,提公升客戶忠誠度與收益。正確時間裡傳送正確郵件是啟用 維持甚至贏回使用者的關鍵,下面針對不同時期使用者如何開展郵件營...

生命週期函式

另外說一下生命週期函式 virtual void onenter virtual void onentertransitiondidfinish virtual void onexit 這3個是遇到對應情況時呼叫的。在cpp檔案裡如果把它們示例了,你可以在開始時放 結束時關閉 等等。如果他下面的之類...

vue的生命週期,什麼是生命週期

簡而言之 建立前 後,載入前 後,更新前 後,銷毀前 後 beforecreate 建立前 在資料觀測和初始化事件還未開始 created 建立後 完成資料觀測,屬性和方法的運算,初始化事件 beforemount 載入前 在掛載開始之前被呼叫,相關的render函式首次被呼叫。mounted 載入...