天天看點

閉包&&IIFE&&堆與棧

文章目錄

    • 1. 什麼是閉包?
    • 2. 閉包的特點?(即優缺點)?
    • 最後總結一下閉包的好處與壞處
      • 好處
      • 壞處
    • 3. 閉包使用場景?
    • 4. 面向過程程式設計思想?面向對象程式設計思想?(了解)
    • IIFE: Immediately Invoked Function Expression
    • 寬放大模式:
    • 堆與棧

1. 什麼是閉包?

閉包就是能夠讀取其他函數内部變量的函數。換句話說:函數嵌套,内層函數就形成了閉包。

本質上說一個函數就是一個閉包。

2. 閉包的特點?(即優缺點)?

優點:閉包可以隔離作用域。不暴露私有成員的目的,減少了變量沖突的風險。

缺點: 局部變量會常駐在記憶體中,嚴重情況下會造成記憶體洩漏。

最後總結一下閉包的好處與壞處

好處

①保護函數内的變量安全 ,實作封裝,防止變量流入其他環境發生命名沖突

②在記憶體中維持一個變量,可以做緩存(但使用多了同時也是一項缺點,消耗記憶體)

③匿名自執行函數可以減少記憶體消耗

壞處

①其中一點上面已經有展現了,就是被引用的私有變量不能被銷毀,增大了記憶體消耗,造成記憶體洩漏,解決方法是可以在使用完變量後手動為它指派為null;

②其次由于閉包涉及跨域通路,是以會導緻性能損失,我們可以通過把跨作用域變量存儲在局部變量中,然後直接通路局部變量,來減輕對執行速度的影響

[詳情](https://www.cnblogs.com/itjeff/p/10106855.html)

3. 閉包使用場景?

閉包主要用來找到父級函數中對應變量的值。

4. 面向過程程式設計思想?面向對象程式設計思想?(了解)

面向過程程式設計就是分析出解決問題所需要的步驟,然後用函數把這些步驟一步一步實作,使用的時候一個一個依次調用就可以了。

優點:解題思路明确,按步驟解決,不易出錯,項目工期和成本友善控制。

缺點:中間某個步驟出錯,有可能造成整個項目崩潰,影響太大。

面向對象程式設計是把構成問題的事務分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描叙某個事物在整個解決問題的步驟中的行為。

優點:面向對象程式設計核心是建構各種對象。友善從全局考慮問題。

缺點:在建構對象時一次性考慮不全,對象屬性和方法缺失。但有解決方案,可以使用繼承來解決。

閉封包檔:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures
https://blog.csdn.net/weixin_43586120/article/details/89456183
https://www.cnblogs.com/sandaizi/p/11582488.html
http://www.ruanyifeng.com/blog/2012/10/javascript_module.html
           

程式設計思想文檔:

https://blog.csdn.net/weixin_38638020/article/details/89318501
https://baike.baidu.com/item/面向過程/9957246
https://baike.baidu.com/item/面向對象程式設計/24792
           

IIFE: Immediately Invoked Function Expression

意為立即調用的函數表達式,也就是說,聲明函數的同時立即調用這個函數

放大模式: 使用場景:如果一個子產品很大,需要分成幾部分,或者一個子產品需要繼承另外一個

子產品,這個時候就可以采用放大模式.

寬放大模式:

在浏覽器環境中,子產品的各個部分通常都是從網上擷取的,有時無法知道哪一部分先加載

// 如果使用module2的寫法則會出現問題,這個時候可以考慮加載一個空的對象,

// 這種模式叫做 寬放大模式 與放大模式相比, 寬放大模式就是立刻執行函數的

// 參數可以是空對象,推薦這種寫法

堆與棧

簡單資料類型,在聲明的同時,回在棧中開辟一個空間,在進行指派操作時,會把自己的值複制一份穿給想要指派的變量。
對所指派的變量進行修改值的操作,不會影響原始變量的值,
引用資料類型,會把位址(16進制)放進棧記憶體中,而值回放進堆記憶體之中,在進行指派操作時,會把位址進行指派。
對所指派的變量進行修改值的操作,會影響原來的值。