函数的三种角色
-
函数在js中有着及其大的地位和意义
-
第一种角色 ==》作为普通函数
-
第二种==》是作为类(构造函数)
-
第三种==》是普通对象
-
三种角色之间可以说是没有什么关联、每种角色有着自己的机制
-
我们通过一个例子来深入理解一下三种角色的作用和区别
function Obj() {
var a = 10;
this.b = 100;
}
Obj.prototype.A = function () { //当作类 给原型添加了A属性
console.log('aa');
};
Obj.B = function () { //相当于给普通对象添加了属性
console.log('bb');
};
Obj(); //无输出
//当作普通函数执行
//1、形成一个执行环境EC 入栈执行
//2、创建变量对象的一个作用域链(scope chain)
//3、然后进入形参赋值、变量提升阶段声明了
//4、代码自上而下执行
//结果是 ==》有一个私有变量a 全局下有一个变量b
var obj = new Obj;
//new Obj作为类(构造函数)
//首先拥有普通函数的流程
//单是在代码执行之前
//1、在私有作用域中创建一个空对象(堆内存开辟一块空间)
//2、将this指向 这个空对象(堆内存的地址)
//3、然后代码自上而下执行
//4、默认返回这个对象的地址
//如果手动return了一个 基本类型值 返回的仍然会是创建的对象
//如果是引用类型值的话 就会覆盖掉默认返回的地址
//结果是 ==》私有作用域中有一个变量a 创建了一个拥有属性b=100的对象
obj.A();
//根据原型链的查找机制
//先在对象实例中找A 没有找到 就沿着obj.__proto__查找到 Obj的原型找到A 执行
//结果为 ==》aa
console.log(obj.B);
//先在实例中查找 没有B属性 沿着原型链 一直查找到Object的原型 的__proto__
//结果为 ==》undefined
console.log(obj.a);
//依然是沿着原型链查找 属性a 没有结果(a是函数执行的私有作用域中的 和实例没有关系)
//结果为 ==》undefined
console.log(obj.b);
//实例中有b属性
//结果为 100
Obj.B();
//Obj作为普通对象的属性调用
//结果为 ==》bb
- 希望能帮助大家对函数有更进一步的理解
- 如有错误 请指出 及时改正 共同学习