每個(gè)函數(shù)都是Function類(lèi)型的實(shí)例
三種創(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ù)就是一個(gè)對(duì)象,通過(guò)new實(shí)例化得到。而函數(shù)名就是一個(gè)保存此對(duì)象的引用。
也正是因?yàn)楹瘮?shù)名就是一個(gè)特殊的變量,所以,在JavaScript中,沒(méi)有函數(shù)重載這一說(shuō),有的只是覆蓋。
函數(shù)聲明提升:函數(shù)的聲明可以提升到作用域的頂層,從而在函數(shù)創(chuàng)建之前調(diào)用函數(shù)也不回導(dǎo)致錯(cuò)誤:
alert(sum(1, 2));
function sum(a, b) { return a + b }
上面說(shuō)到函數(shù)其實(shí)就是一個(gè)特殊的變量,所以作為一個(gè)值的函數(shù)有以下作用:
- 函數(shù)作為另一個(gè)函數(shù)的參數(shù)。
- 函數(shù)作為另一個(gè)函數(shù)的返回值。
在函數(shù)內(nèi)部有兩個(gè)特殊的對(duì)象:arguments, this 。
arguments:arguments是一個(gè)類(lèi)數(shù)組對(duì)象,里面保存著調(diào)用函數(shù)時(shí)傳入函數(shù)的參數(shù)
arguments有一個(gè)叫callee的屬性,arguments.callee保存著這個(gè)函數(shù)的引用。
this:this引用的是函數(shù)執(zhí)行的環(huán)境對(duì)象。
函數(shù)作為對(duì)象本身有兩個(gè)對(duì)象:length, prototype 。
length:length屬性是聲明函數(shù)時(shí)參數(shù)的個(gè)數(shù)。
prototype:prototype里面保存著Function類(lèi)的實(shí)例方法。
函數(shù)作為對(duì)象有三個(gè)方法:call(), apply(), bind() 。
三個(gè)方法的作用都是改變函數(shù)內(nèi)部的this對(duì)象的引用。
apply():apply方法的第一個(gè)參數(shù)是一個(gè)對(duì)象,用來(lái)替代調(diào)用該方法的函數(shù)的this,第二個(gè)是一個(gè)數(shù)組,保存著函數(shù)的參數(shù)。
call():call方法的第一個(gè)參數(shù)的作用與call相同,不同的是,后面的參數(shù)可以是多個(gè),每一個(gè)都是函數(shù)的參數(shù)。
bind():bind方法也可以修改作用域,但不同的時(shí),此方法會(huì)返回一個(gè)新的函數(shù),這個(gè)新的函數(shù)中的this會(huì)是bind方法中傳入的參數(shù)對(duì)象。