函數(shù)在整個JS中是最復(fù)雜也是最重要的
1瓤摧、一個函數(shù)存在了多面性:
”普通函數(shù)“:它本身就是一個普通的函數(shù)竿裂,執(zhí)行的時候形成私有作用域(閉包),形參賦值照弥,預(yù)解釋腻异,代碼執(zhí)行,執(zhí)行完成后桟內(nèi)存銷毀/不銷毀
”類“:它有自己的實(shí)例这揣,也有一個叫prototype屬性是自己的原型悔常,它的實(shí)例都可以指向自己的原型
”普通對象":和var obj={ }中的obj一樣,就是一個普通的對象给赞,它作為對象可以有一些自己的私有屬性机打,也可以通過______proto__找到Function.prototype
以上這三者之間沒有必然關(guān)系
function Fn(){
var num=500;
this.x=100;
}
Fn.prototype.getX=function(){
console.log(this.x);
};
Fn.aaa=1000;
var f=new Fn; //Fn中的this是f
a、f.num; f.aaa; //--->undefined片迅,undefined
因?yàn)関ar f=new Fn残邀,所以這里的Fn是一個類,f為實(shí)例。num和aaa既不是私有屬性也不是公有屬性芥挣,所以不賦給實(shí)例f驱闷,所以均為undefined
b、var res=Fn(); //Fn中的this是window res=undefined
因?yàn)関ar res=Fn();說明Fn是一個普通函數(shù)空免,按作用域鏈來看空另,F(xiàn)n()前面沒有“ . ”,所以this指的是window
c、Fn.aaa;
此時Fn是對象
分析:
Function:函數(shù)類鼓蜒,所有的函數(shù)都是它的一個實(shí)例痹换,所以函數(shù)也算是對象數(shù)據(jù)類型,所以每個函數(shù)也具有______proto__屬性都弹。(世間萬物皆對象)
——————————————————————————————————————————
函數(shù)本身也有一些自己的屬性:
a娇豫、length:形參的個數(shù)
b、name:函數(shù)名
c畅厢、prototype:類的原型冯痢,在原型上定義的方法都是當(dāng)前Fn這個類實(shí)例的公有方法
d、______proto__:把函數(shù)當(dāng)作一個普通的對象框杜,指向Function這個類的原型