函数在整个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是对象
分析:
Function:函数类,所有的函数都是它的一个实例,所以函数也算是对象数据类型,所以每个函数也具有______proto__属性。(世间万物皆对象)
——————————————————————————————————————————
函数本身也有一些自己的属性:
a、length:形参的个数
b、name:函数名
c、prototype:类的原型,在原型上定义的方法都是当前Fn这个类实例的公有方法
d、______proto__:把函数当作一个普通的对象,指向Function这个类的原型