函數在整個JS中是最復雜也是最重要的
1、一個函數存在了多面性:
”普通函數“:它本身就是一個普通的函數,執行的時候形成私有作用域(閉包),形參賦值,預解釋,代碼執行,執行完成后桟內存銷毀/不銷毀
”類“:它有自己的實例,也有一個叫prototype屬性是自己的原型,它的實例都可以指向自己的原型
”普通對象":和var obj={ }中的obj一樣,就是一個普通的對象,它作為對象可以有一些自己的私有屬性,也可以通過______proto__找到Function.prototype
以上這三者之間沒有必然關系
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
因為var f=new Fn,所以這里的Fn是一個類,f為實例。num和aaa既不是私有屬性也不是公有屬性,所以不賦給實例f,所以均為undefined
b、var res=Fn(); //Fn中的this是window res=undefined
因為var res=Fn();說明Fn是一個普通函數,按作用域鏈來看,Fn()前面沒有“ . ”,所以this指的是window
c、Fn.aaa;
此時Fn是對象
image.png
分析:
Function:函數類,所有的函數都是它的一個實例,所以函數也算是對象數據類型,所以每個函數也具有______proto__屬性。(世間萬物皆對象)
——————————————————————————————————————————
函數本身也有一些自己的屬性:
a、length:形參的個數
b、name:函數名
c、prototype:類的原型,在原型上定義的方法都是當前Fn這個類實例的公有方法
d、______proto__:把函數當作一個普通的對象,指向Function這個類的原型