关于函数的三种角色

函数的三种角色

  • 函数在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
  • 希望能帮助大家对函数有更进一步的理解
  • 如有错误 请指出 及时改正 共同学习
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木木林_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值