學習筆記 七 函式表示式

2022-04-03 17:28:04 字數 1405 閱讀 9532

函式表示式是一種函式的定義方式,在js中能夠利用它結合閉包實現很多功能。不過,因為建立閉包必須維護額外的作用域,所以過度使用它們可能會占用大量記憶體。

函式定義方式:

1)函式宣告:這種方式在**執行之前會準備到在執行上下文中,所以可以把函式宣告放在呼叫之後,叫做函式宣告提公升。

2)函式表示式:使用這種方式建立的函式叫做匿名函式(拉姆達函式),這種方式函式定義不會準備到執行上下文中,只有其賦值的變數會準備到執行上下文中,且變數值為undefined。

1.遞迴

在使用遞迴函式定義時,為了防止函式名重新賦值造成遞迴函式內部在呼叫函式本身時報錯,一般遞迴內部函式不直接使用函式名,而是使用arguments.callee或者遞迴函式定義採用命名函式表示式(帶有函式名的函式表示式定義形式)的形式。

2.閉包(當函式作為返回值或者引數時,函式中的變數取值也會帶著,他們的取值要到函式原來對應的作用域鏈中去尋找。由於閉包會攜帶包含它的函式的作用域,因此會比其他函式占用更多的記憶體,所以我們只在絕對必要的情況下使用閉包。)

1)閉包的***:因為在閉包情況下函式內部變數的取值是從原來所在的作用域鏈中查詢的,而閉包中儲存的是作用域鏈中整個變數物件的引用,所以變數的取值只能取得相應作用域鏈中變數最後的值(因為是個引用)。(當然有解決方法,具體解決方式看原文7.2.1)。

2)閉包情況下的內部函式中的this通常指向window物件。(每個函式在被呼叫時都會自動取得兩個特殊變數:this和arguments。內部函式搜尋這兩個變數時,就會搜尋到這兩個變數了,因此永遠無法直接訪問外部函式中的相應變數)

3)記憶體洩漏:如果閉包的作用域鏈中儲存著乙個html元素,那麼就意味著該元素永遠無法被銷毀。

3.模仿塊級作用域

匿名函式可以用來模仿塊級作用域(私有作用域)。這種技術通常在全域性作用域中被用在函式外部,從而顯示向全域性作用域中新增過多的變數和函式。

語法如下:(function()={

//這裡新增塊級作用域

4.私有變數(任何在函式中定義的變數,都可以認為是私有變數,包括函式的引數、區域性變數和函式內部定義的其他函式)

利用閉包就可以建立方位私有變數的公有方法,這種方法稱為特權方法。

1)建構函式模式:直接在建構函式中定義特權方法,這種方式和建構函式模式一樣,都有缺點,針對每個例項都會建立一組方法。

2)原型模式:在私有作用域中定義私有變數和方法:這種方式使用原型,增加了**復用,但每個例項都沒有自己的私有變數,只有靜態私有變數。

3)模組模式:函式內部返回乙個物件字面量形式的物件(單例:只返回建立這麼乙個物件),而這個物件中定義了訪問函式內部私有變數和方法的屬性。(這種模式在必須建立乙個物件,並以某些資料對其進行初始化,同時還要公開一些能夠訪問這些私有資料的方法的情況下使用)。

4)增強的模快模式:這種模式和模組模式類似,唯一的區別在於返回的物件不是以物件字面量的形式定義的無型別的物件,而是返回乙個指定型別的物件。

函式表示式

函式定義有以下兩種方式 一種是函式宣告,一種是函式表示式。函式宣告 在執行 之前會先讀取函式宣告,即函式宣告提公升。函式表示式 常用語法形式是常規的變數賦值語句,即建立乙個匿名函式並賦值給乙個變數。函式表示式在使用之前必須賦值,否則會出錯,這點與函式宣告提公升不同。能夠將匿名函式作為其他函式的值進行...

函式表示式

定義函式的方式有兩種 一種是函式宣告,另一種是函式表示式 函式宣告語法格式如下 function functionname arg0,arg1,arg2 關於函式宣告,有乙個重要的特徵就是函式宣告提公升,意思是在執行 之前會先讀取函式宣告 函式表示式語法格式如下 var functionname f...

函式表示式

函式表示式在使用前必須先賦值。函式表示式,使用前必須先賦值var functionname function arg0,arg1 匿名函式或拉姆達函式 arguments.callee 是乙個指向正在執行的函式的指標,因此可以用它來實現對函式 的遞迴呼叫,function factorial num...