標籤:
函數運算式是JavaScript中的一個既強大有容易令人困惑的特性 定義函數的方式有兩種,一種是函式宣告,另一種就是函數運算式
關於函式宣告,它的一個重要特徵就是函式宣告提升,意思是在執行代碼前會讀取函式宣告,這就意味著可以把函式宣告放在調用它的語句後面
sayHi();function sayHi(){alert("hi");}
第二種建立函數的方式是使用函數運算式,函數運算式有幾種不同的文法形式
最常見的一種方式是
var functionName = function(arg0,arg1,arg2){//函數體};
理解函數提升的關鍵,就是理解函式宣告與函數運算式之間的區別 例如 執行以下代碼的結果可能會讓人意想不到
if(conditon){function sayHi(){alert("yes");}else function sayHi(){alert("no");}}
大多數情況下,瀏覽器會返回第二個申明,忽略condition
閉包
不少開發人員搞不清匿名函數和閉包的概念 閉包是指有權訪問另一個函數範圍中的變數的函數,建立閉包的常見方式,就是在一個函數內部建立另外一個函數
私人變數:嚴格來講JavaScript中沒有私人成員的概念;所有對象屬性都是公有的,不過倒是有一個私人變數的概念,任何在函數中定義的變數,都可以認為是私人變數,因為不能再函數的外部存取這些變數,私人變數包括函數的參數,局部變數和在函數內部定義的其他函數
function add(num1,num2){
var sum = num1 + num2;
return sum;
}
在這個函數內部,有三個私人變數,num1,num2,sum 在函數內部可以方位這幾個變數,但在函數外部則不能訪問他們,如果在這個函數內部建立一個閉包,那麼閉包通過自己的範圍鏈也可以訪問這些變數,而利用這一點,就可以建立用於訪問私人變數的公有方法
我們把有權訪問私人變數和私人函數的公有方法稱為特權方法,有兩種在對象上建立特權的方式,第一種是在建構函式中定義特權方法,基本模式如下
function Person(name){ this.getName = function(){return name;}; this.setName = function(value){name = value;};}var person = new Person("niko");alert(person.name);//person.setName("gred");alert(person.name);
以上代碼定義了兩個特權方法,這兩個方法都可以再建構函式外部使用
靜態私人變數 通過在私人範圍中定義私人變數或者函數,同樣可以建立建立特權方法
(function(){var privateViarable = 10;//私人變數和私人函數function privateFunction(){return false;}MyObject = function(){};//建構函式MyObject.prototype.publiceMethod = function(){privateViarable++;return privateFunction();};})();
模組模式:前面的模式是用於為自訂類型建立私人變數和特權方法的而道格拉斯所說的模組模式則是為單例建立私人變數和特權方法,所謂單例,指的就是只有一個執行個體的對象,按照慣例,JavaScript是以對象字面量的方式來建立單例對象的
var singleton = {name: value;method : function(){//這裡是代碼的方法}};
var singleton = function(){ var privateVariable = 10; function privateFunction(){return false;} //特權,公有方法和屬性 return{publicProperty : true, publicMethod : function(){privateVariable++;return privateFunction();}}; };();
JavaScript進階程式設計7學習筆記之函數運算式