Function類型前端
函數是對象,函數名是指針:每一個函數都是Function類型的實例。因爲函數是對象,所以函數名是一個指向函數對象的指針,不會與某個函數綁定,一個函數可能會有多個名字。express
function getSum(a, b) { return a + b; }//前端全棧學習交流圈「866109386 alert(getSum(2, 3));//5 var copy = getSum; alert(copy(2, 3));//5 getSum = null; alert(copy(2, 3));//5
定義函數的方式有三種:函數聲明、函數表達式、Function構造函數。數組
Function構造函數接收任意數量的參數,前面的參數枚舉了函數的參數,最後一個參數是函數體。通常不推薦使用Function構造函數定義函數。瀏覽器
var getSum = new Function("a", "b", "return a + b";
JavaScript沒有函數重載的概念,若聲明瞭兩個同名函數,則後面的函數會覆蓋前面的函數。函數
因爲函數名自己是變量,所以函數也能夠做爲值來使用,不只能夠傳遞一個函數做爲參數,還能夠將函數做爲返回值。學習
function callFunction(func, arguments) { return func(arguments); }//前端全棧學習交流圈:866109386 function sayHello(name) { return "Hello, " + name; } var result = callFunction(sayHello, "Alice"); alert(result);//Hello, Alice
①、函數聲明指針
function 函數名稱(參數|可選) { 函數體 }code
例:對象
function func1(){// 聲明,程序的一部分 function func() {// 聲明,函數體的一部分 ...//函數體 } }
②、函數表達式遞歸
function 函數名稱|可選(參數|可選) { 函數體 }
例1:
var fun = function func() {};//表達式,賦值表達式的一部分
例2:
new function func(){};//表達式,new表達式
例3:
(function func(){}); //表達式,包含在分組操做符——括號()內,括號()內只能包含表達式
例4:
[function func() {}];//表達式,數組初始化器內只能是表達式
例5:
1, function func() {};//表達式,逗號只能操做表達式
③、函數構造器
函數構造器建立的函數的[[Scope]]屬性僅包含全局對象。
<script> var a = 1; func1(); function func1() { var a = 2; var b = 3; var func2 = new Function("alert(a); alert(b);"); func2();//1,b is not defined } </script>
函數構造器建立的函數func2能夠從全局對象中取得變量a,但全局對象中沒有b,所以報錯:b未定義。
函數聲明和函數表達式的區別
1)函數聲明在進入上下文階段建立,在代碼執行階段就已經可用了,函數表達式則是在代碼執行階段才建立,因此函數聲明能夠提高,但函數表達式則不能。
函數聲明提高:
func();//報錯:func is not a function var func = function (){ alert("Function expression"); }
2)函數聲明影響變量對象VO,也就是存儲在上下文的VO中的變量對象,函數表達式不影響變量對象VO,不存在於變量對象中,這意味着既不可能經過名稱在函數聲明以前調用它,也不可能在聲明以後調用它。可是,函數表達式在遞歸調用中能夠經過名稱調用自身。 例1:
alert(func); //報錯:func is not a function。定義以前不可用,由於它在代碼執行階段建立 (function func() {}); alert(func); //報錯:func is not a function。定義以後也不可用,由於它不在變量對象
例2:
(function func(param) { if (param) { return; } func(true);//func可用,遞歸調用能夠經過名稱調用自身 })(); func(); // func is not a function,外部不可用
3)函數聲明只能出如今程序或函數體內,不能出如今表達式或塊({ … })中,如if、while或for語句中。由於JavaScript無塊級做用域,只有函數和全局做用域。 函數表達式出如今表達式的位置。
函數聲明:有的瀏覽器會返回if,而有的瀏覽器會返回else。
if (true) { function func() { alert('if'); } } else { function func() { alert('else'); } } func();
函數表達式:全部瀏覽器都返回if。
var func; if (true) { func = function() { alert('if'); }; } else { func = function() { alert('else'); }; } func();