在javascript中函數的申明方式有四種 下面代碼中一句代表了一種
1 function func1(…){…}
2 var func2=function(…){…};
3 var func3=function func4(…){…};
4 var func5=new Function();
第一種就是我們常見的函數申明方式,函數名為func1。第二種和第三種的區別是第二種是匿名函數,而第三種不是。第四種用的是對象申明的方式,因為javascript每個函數就是一個對象。1 //這兩種聲明是等價的
2 function func1(a,b){
3 return a+b;
4 }
5 var func1 = new Function("a","b","return a+b");
匿名函數和有名字函數在javascript中是有點區別的我們看代碼1 //聲明一個匿名函數
2 func1();
3 var func1 = function(){
4 alter(1);
5 }
運行Firefox
firbug中說func1未定義
看看另外一種方式
1 func1();
2 function func1(){
3 alert(1);
4 }
由此可見,儘管JavaScript是一門解釋型的語言,但它會在進行函數調用時,檢查整個
代碼中是否存在相應的函數定義,這個函數名只有是通過 function funcName()形式定義的才有效,而不能是匿名函數。
匿名函數的申名方式有個好處就是防止函數重新命名。在javascript還有匿名函數可以在申明之後立即調用,代碼如下。
1 var i=function(a,b){
2 return a+b;
3 }(1,2);
這裡i=3是傳回值而不是函數,這是因為()的優先順序比=高
在jquery中的外掛程式擴充就是這樣實現的,我們來看看代碼。
1 (function($){
2
3 $.fn.select = function(select) {
4 if (select == undefined) select = true;
5 return this.each(function() {
6 var t = this.type;
7 if (t == 'checkbox' || t == 'radio')
8 this.checked = select;
9 else if (this.tagName.toLowerCase() == 'option') {
10 var $sel = $(this).parent('select');
11 if (select && $sel[0] && $sel[0].type == 'select-one') {
12 // deselect all other options
13 $sel.find('option').select(false);
14 }
15 this.selected = select;
16 }
17 });
18 };
19
20 })(jquery)
注意直接這樣寫
function(a,b){
return a+b;
}(1,2)
是會報語法錯誤的。