1.function是對(duì)象缩幸、創(chuàng)建的也是對(duì)象引用
三種創(chuàng)建方式 最后一種不推薦
M1:
function func(){
alert("使用很普遍的函數(shù)創(chuàng)建方式");
}
M2:
var func=function(){
alert("直接儲(chǔ)存在變量當(dāng)中");
}
M3:
var func=function("參數(shù)1","參數(shù)2","參數(shù)n","alert("不要花括號(hào)髓堪,直接創(chuàng)建")");
2. 在代碼運(yùn)行之前,解析器經(jīng)過(guò) 代碼提升的過(guò)程 首先將函數(shù)聲明創(chuàng)建出來(lái) 確保函數(shù)能夠正常使用 再將聲明函數(shù)提到頂部 然后執(zhí)行
函數(shù)調(diào)用在函數(shù)創(chuàng)建之前搞坝,結(jié)果并不會(huì)出錯(cuò)搔谴。
var Vsum=sum(10);
alert(Vsum);
function sum(maxV){
"use strict"
for(var i=0;i<maxV;i++){
var sum+=0;
}
return sum;
}
另一種情況就會(huì)出錯(cuò)。
var Vsum=sum(10);
alert(Vsum);
var sum=function(maxV){
"use strict"
for(var i=0;i<maxV;i++){
var sum+=0;
}
return sum;
} //unexpected identifier
出錯(cuò)的原因就是因?yàn)楹瘮?shù)創(chuàng)建位于頂部桩撮,但是函數(shù)的聲明不是
3.函數(shù)內(nèi)部擁有argument和this倆個(gè)特殊對(duì)象
argument是保存擁有它的函數(shù)的參數(shù)
argument擁有一個(gè)屬性callee敦第、它是一個(gè)指針 能夠指向擁有argument對(duì)象的函數(shù)
這個(gè)方法可以用來(lái)解耦合 經(jīng)典例子 遞歸實(shí)現(xiàn)階乘
alert(factorial(10));
function factorial(Vmax){ //Vmax>0
if(Vmax<=1)return 1;
else{
return Vmax*factorial(Vmax-1);
}
}
利用arguments節(jié)耦合
alert(factorial(10));
funciton factorial(Vmax){
if(Vmax<=1)return 1;
else{
return Vmax*arguments.callee(Vmax-1);
}
}
但在嚴(yán)格模式下使用會(huì)出錯(cuò)
4. this對(duì)象 類似java和c#中的this 都是指向當(dāng)前的作用域 當(dāng)沒(méi)有其他作用域時(shí)候 指向window 例子:
5. ECMAScript5還定義函數(shù)對(duì)象另一個(gè)屬性caller、它保存著引用當(dāng)前函數(shù)的函數(shù)的引用店量、如果為window則為null 實(shí)例:
除此之外芜果、ECMAScript還為每個(gè)函數(shù)對(duì)象定義了length和prototype屬性方法。length表示每個(gè)函數(shù)對(duì)象希望能接受幾個(gè)參數(shù) prototype則是真正保存著函數(shù)中所有實(shí)例方法真正所在 實(shí)際上toString和ValueOf都是保存在prototype名下 只是通過(guò)各自的實(shí)例對(duì)象調(diào)用罷了
每個(gè)函數(shù)都包含著非繼承而來(lái)的方法 apply和call方法
apply和call方法都接受倆個(gè)參數(shù)
第一個(gè)參數(shù)都接收作用域this
第二個(gè)參數(shù)apply可以接收數(shù)組參數(shù)或者arguments(保存當(dāng)前函數(shù)的參數(shù)) call則只能接收按順序排列單個(gè)排列的參數(shù)
需要注意的是 apply和call最主要用作擴(kuò)充函數(shù)的作用域融师、而非傳遞函數(shù)右钾。
window.color="red";//全局屬性
var o_bule={
color:"bule"
}
function toStringColor(){
console.log(this.color);
}
toStringColor.call(this);//red
toStringColor.call(o_bule);//bule
toStringColor().call(window); //red