上節咱們介紹了《JavaScript工做體系中不可或缺的函數》,函數是由事件驅動的或者當它被調用時執行的可重複使用的代碼塊。接下來咱們說說js當中定義(聲明)函數的幾種方式,以及每種方式的特色和與其餘方式的區別。html
一、 函數式聲明html5
function funName(arg1, arg2)
{設計模式
alert(arg1 + 「,」 + arg2);
}函數
特色:此種方式可定義命名的函數變量,而無需給變量賦值,這是一種獨立的結構,不能嵌套在非功能模塊中。函數名在自身做用域和父做用域內是可獲取的(其餘域是娶不到的)。當解析器讀取js代碼時,會先讀取函數的聲明,此種方式定義的函數在執行任何代碼以前均可以訪問(調用)。this
二、 函數表達式(函數字面量)prototype
var fun = function(arg1, arg2){設計
alert(arg1 + 「,」 + arg2);
}
var fun = function funName(arg1,arg2){code
alert(arg1 + 「,」 + arg2);
}htm
(function hello(){對象
alert(「HelloWorld!!!」);
})(); // 自調用
特色:地中方式是將函數定義爲表達式語句的一部分。函數能夠是命名的也能夠是匿名的。並且必須等到解析器執行到它所在的代碼行才能真正被解釋執行。
三、 函數構造法,參數必須加引號
var fun = new Function(‘arg1’, ‘arg2’, ‘alert(arg1 + 「,」 + arg2)’);
特色:從技術角度講,這是一個函數表達式。可是通常不推薦這種方式。
四、 對象直接量
var obj = {
name : 「」, getName : function(){ return this.name;
},
setName : function(name){
this.name = name;
}
};
特色:將方法的定義看作爲一個對象的成員變量,此時對象的變量值爲一個方法,經過訪問該對象的屬性名稱,達到調用方法的效果。
五、 原型繼承
var obj = new Function();
obj.prototype = {
name : 「」, getName : function(){ return this.name;
},
setName : function(name){
this.name = name;
}
};
特色:定義了一個函數對象,在其原型對象中定義方法。在使用prototype的方法時,必須實例化該對象才能調用其方法。
六、 工廠模式
function obj(){
var temp = new Object();
temp.name = 「」;
temp.getName = function(){
return this.name;
};
temp.setName(name){
this.name = name;
};
return temp;
}
特色:工廠模式是軟件工程領域一種廣爲人知的設計模式,因爲在ECMAScript中沒法建立類,所以用函數封裝以特定接口建立對象。即在一個函數內建立一個對象,給對象賦予屬性和方法再將其對象返回。
以上介紹的幾種js中建立方法經常使用的方式,根據其特色和理解能夠根據實際狀況使用不一樣的方式聲明函數。