函數表達式
1、JavaScript中定義函數有2鐘方法:
1-1.函數宣告:
}
①name屬性:可讀取函數名稱。非標準,瀏覽器支援:FF、Chrome、safari、Opera。
③ECMAScript中的無效函數語法:
複製程式碼
程式碼中的重複函數宣告
代碼如下:
if判斷函數表達式
var sayHi;
if(condition){
sayHi = function(){
alert("Hi!"); (){
, factorial變數設為null後不再引用函數,而anotherFactorial(4)中要執行factorial()函數,故出錯。
使用argument.callee(指向正在執行的函數的指標)可解決:
複製程式碼
複製程式碼
if (num return 1;
> }
}
4、閉包
全域變數物件是最外圍的一個執行環境。在網頁瀏覽器中被認為是window對象,故所有全域物件和函數都是window對象的屬性和方法所創建的。 執行環境中的程式碼執行完後,該環境就被銷毀,保存其中的變數和函數定義也隨之銷毀。
②程式碼在環境中執行時,會建立變數物件的一個作用域鏈scope chain,用於確保對執行環境有權存取的所有變數和函數的有序存取。 作用域鏈前端,始終是目前執行的程式碼所在環境的變數物件。當該環境為函數時,會將活動物件作為變數物件。
活動物件最開始只包含一個變量,即argumnt物件。
作用域鏈中的下一個變數物件來自包含環境,而下一個變數物件來自下一個包含環境,直到延續到全域執行環境。
4-2.函數建立、執行時:
複製程式碼
4-3.閉包的作用域鏈
在另一個函數內部定義的函數會將包含函數的活動物件加入它的作用域鏈中。
①將函數物件賦值null,等於通知垃圾回收程式將其清除,隨著函數作用域鏈被銷毀,其作用域鏈(不除了全域作用域)也會被安全銷毀。
②由於閉包會攜帶包含函數的作用域,所以會比其他函數佔用更多記憶體。
4-4.閉包與變數
作用域鏈的一個副作用:閉包只能取得包含函數中任何變數的最後一個值。
this物件是在運行時基於函數的執行環境綁定的。 在全域函數中,this等於window;當函數被某物件呼叫時,this為該物件。
匿名函數的執行環境具有全局性,其this物件通常指window。透過call()或spply()改變函數執行環境時,this指向其物件。 ①每個函數在被呼叫時,都會自動取得兩個特殊變數:this和argument。內部函數在搜尋這兩個變數時,只會搜尋到期活動物件為止,永遠不可能存取外部函數的這兩個變數。
不過將外部作用域的this物件保存在一個閉包能存取的變數裡,就可讓閉包存取該物件。
var name = "The Window";
var object = {
name : "My Object",
getNameFunc: function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()()); //"MyObject"
5. Convert function declaration to function expression
JavaScript puts the function keyword at the beginning of the function declaration, but the function declaration cannot be followed by parentheses, so function(){......}(); will cause an error.
To convert a function declaration into a function expression, add a pair of parentheses to the function declaration: