JS作用域 執行上下文 遞迴與閉包

2022-07-14 09:03:10 字數 2098 閱讀 7871

目錄

作用域全域性作用域

函式作用域

執行上下文

函式執行上下文

執行上下文棧

作用域與執行上下文的區別

遞迴閉包

產生閉包的條件

閉包的作用

使用注意 

記憶體洩漏

記憶體溢位(一種程式執行出現的錯誤)

作用域指乙個變數的作用範圍。它是靜態的(相對於上下文物件), 在編寫**時就確定了。

作用:隔離變數,不同作用域下同名變數不會有衝突。

直接編寫在script標籤中的js**,都在全域性作用域。

在全域性作用域中:

全域性作用域中的變數都是全域性變數,在頁面的任意的部分都可以訪問到。

呼叫函式時建立函式作用域,函式執行完畢以後,函式作用域銷毀。每呼叫一次函式就會建立乙個新的函式作用域,他們之間是互相獨立的。

在函式作用域中可以訪問到全域性作用域的變數,在全域性作用域中無法訪問到函式作用域的變數。簡單講就是裡面可以訪問外面,但是外面不能訪問裡面。

在函式中要訪問全域性變數可以使用window物件。

在函式作用域也有宣告提前的特性:

因此,在函式中,沒有var宣告的變數都會成為全域性變數,而且並不會提前宣告。

在呼叫函式, 準備執行函式體之前, 建立對應的函式執行上下文物件(虛擬的, 存在於棧中)。

(1)對區域性資料進行預處理:

(2)開始執行函式體**

區別1:

區別2:

聯絡:

乙個函式通過名字呼叫自身的情況,好處是**簡潔。在樹的前序,中序,後序遍歷演算法中,遞迴的實現明顯要比迴圈簡單得多。

注意:

缺點:

有權訪問另外乙個函式作用域中的變數的函式。當內部函式被儲存在外部時,將會生成閉包。

缺點:閉包導致原有作用鏈不釋放,導致記憶體洩露(漏得越多,等價占用的記憶體越多,剩下的可用記憶體就少了)。

全域性變數和區域性變數,該特殊之處在於函式內部可以讀取全域性變數,但是函式外部是不能讀取區域性變數的。函式內部宣告變數的時候,一定要使用var命令。這就導致乙個問題,如果我們需要從外部讀取函式內的區域性變數的時候,就必須採用一種特殊的方式,在函式內部再定義乙個函式。

我們只需要將f2作為返回值,就可以讀取f1的內部變數了。

上述f2就是閉包,也就是說閉包是乙個可以讀取其他函式內部變數的函式;即乙個函式內部的函式。

舉例1:

ps:外部函式f1執行完畢後,變數a並沒有消失,而是儲存在了記憶體中。

內部採用函式表示式,沒有產生閉包的原因如下:

ps:f1執行完了之後外部i值已經是10了,函式內部只是引用 ,只有外部呼叫的時候才會執行函式,那時候i就已經是10了,而且10個函式都指向同乙個ao。

舉例2:將所有的資料和功能都封裝在乙個函式內部(私有的),只向外暴露乙個包含n個方法的物件或函式。

記憶體洩漏:占用的記憶體沒有及時釋放。記憶體洩露積累多了就容易導致記憶體溢位。

常見的記憶體洩露:

記憶體溢位:當程式執行需要的記憶體超過了剩餘的記憶體時,就出丟擲記憶體溢位的錯誤。

js中執行上下文與閉包

執行上下文ec execution context 執行上下文功能 執行之前的準備工作,確定當前環境下變數的取值。執行上下文目的 用來存放資料的。分類 1 全域性上下文 全域性上下文只有乙個 開啟乙個視窗就會建立乙個全域性上下文,關閉頁面就銷毀 2 區域性上下文 函式執行完畢銷毀 呼叫函式就會建立乙...

作用域與執行上下文

1.區別1 全域性作用域之外,每個函式都會建立自己的作用域,作用域在函式定義時就已經確定了,而不是在函式呼叫時 全域性執行上下文環境是在全域性作用域確定之後,js 馬上執行之前建立 函式執行上下文環境是在呼叫函式時,函式體 執行之前建立 2.區別2 作用域是靜態的,只要函式定義好了就一直存在,且不會...

原型 執行上下文 作用域 閉包 記憶體溢位 洩漏

函式高階 原型與原型鏈 給原型物件新增屬性 一般是方法 顯式原型與隱式原型 原型鏈 object的原型物件是原型鏈盡頭 屬性問題 探索instanceof function是通過new自己產生的例項 執行上下文與執行上下文棧 函式宣告提公升 執行上下文 全域性執行上下文 開始執行全域性 函式執行上下...