JavaScript引用型別Function例項詳解
Function型別
函式是物件,函式名是指標:每個函式都是Function型別的例項。由於函式是物件,因此函式名是一個指向函式物件的指標,不會與某個函式繫結,一個函式可能會有多個名字。
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 函式名稱(引數|可選) { 函式體 }
例:
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();