每個函數(shù)都是Function類型的實例
三種創(chuàng)建函數(shù)的方法:
// 方法一
function sum(num1, num2) {
return num1+num2;
}
//方法二
var sum = function(num1, num2) {
return num1+num2;
};
//方法三
var sum = new Function(“num1”, “num2”, “return num1+num2;”);
最好不用方法三去創(chuàng)建函數(shù)赶撰,但是方法三可以更清晰的看到,函數(shù)就是一個對象,通過new實例化得到红氯。而函數(shù)名就是一個保存此對象的引用框咙。
也正是因為函數(shù)名就是一個特殊的變量,所以痢甘,在JavaScript中喇嘱,沒有函數(shù)重載這一說,有的只是覆蓋塞栅。
函數(shù)聲明提升:函數(shù)的聲明可以提升到作用域的頂層者铜,從而在函數(shù)創(chuàng)建之前調(diào)用函數(shù)也不回導致錯誤:
alert(sum(1, 2));
function sum(a, b) { return a + b }
上面說到函數(shù)其實就是一個特殊的變量,所以作為一個值的函數(shù)有以下作用:
- 函數(shù)作為另一個函數(shù)的參數(shù)构蹬。
- 函數(shù)作為另一個函數(shù)的返回值王暗。
在函數(shù)內(nèi)部有兩個特殊的對象:arguments, this 。
arguments:arguments是一個類數(shù)組對象庄敛,里面保存著調(diào)用函數(shù)時傳入函數(shù)的參數(shù)
arguments有一個叫callee的屬性俗壹,arguments.callee保存著這個函數(shù)的引用。
this:this引用的是函數(shù)執(zhí)行的環(huán)境對象藻烤。
函數(shù)作為對象本身有兩個對象:length绷雏, prototype 。
length:length屬性是聲明函數(shù)時參數(shù)的個數(shù)怖亭。
prototype:prototype里面保存著Function類的實例方法涎显。
函數(shù)作為對象有三個方法:call(), apply()兴猩, bind() 期吓。
三個方法的作用都是改變函數(shù)內(nèi)部的this對象的引用。
apply():apply方法的第一個參數(shù)是一個對象倾芝,用來替代調(diào)用該方法的函數(shù)的this讨勤,第二個是一個數(shù)組,保存著函數(shù)的參數(shù)晨另。
call():call方法的第一個參數(shù)的作用與call相同潭千,不同的是,后面的參數(shù)可以是多個借尿,每一個都是函數(shù)的參數(shù)刨晴。
bind():bind方法也可以修改作用域,但不同的時路翻,此方法會返回一個新的函數(shù)狈癞,這個新的函數(shù)中的this會是bind方法中傳入的參數(shù)對象。