zoukankan      html  css  js  c++  java
  • this的总结:默认绑定、隐式绑定、显式绑定、new绑定、箭头函数绑定

    this绑定,在面试的时候被问到的频率几乎是百分之百。今天面试的时候,被问到了什么是显示绑定和隐式绑定(懵逼),还有解释各种不同绑定的问题,还有笔试题。所以弄懂this绑定特别重要。

    this可以分为默认绑定,显示绑定,隐式绑定,new绑定,箭头函数绑定等。

    1.默认绑定:

    this默认绑定我们可以理解为函数调用时无任何调用前缀的情景,它无法应对我们后面要介绍的另外四种情况,所以称之为默认绑定,默认绑定时this指向全局对象(非严格模式):
    

    2.隐式绑定:

    什么是隐式绑定呢,如果函数调用时,前面存在调用它的对象,那么this就会隐式绑定到这个对象上。
    如果函数调用前存在多个对象,this指向距离调用自己最近的对象

    3.显示绑定:

    显式绑定是指我们通过call、apply以及bind方法改变this的行为,相比隐式绑定,我们能清楚的感知 this 指向变化过程。

    其中call, apply, bind的区别?

    1.call、apply与bind都用于改变this绑定,但call、apply在改变this指向的同时还会执行函数,而bind在改变this后是返回一个全新的boundFunction绑定函数,
    这也是为什么上方例子中bind后还加了一对括号 ()的原因。 2.bind属于硬绑定,返回的 boundFunction 的 this 指向无法再次通过bind、apply或 call 修改;call与apply的绑定只适用当前调用,调用完就没了,下次要用还得再次绑。 3.call与apply功能完全相同,唯一不同的是call方法传递函数调用形参是以散列形式,而apply方法的形参是一个数组。在传参的情况下,call的性能要高于apply,因为apply在执行时还要多一步解析数组。

    4.new绑定

    准确来说,js中的构造函数只是使用new 调用的普通函数,它并不是一个类,最终返回的对象也不是一个实例,只是为了便于理解习惯这么说罢了。

    那么new一个函数究竟发生了什么呢,大致分为三步:

    1.以构造器的prototype属性为原型,创建新对象;
    
    2.将this(可以理解为上句创建的新对象)和调用参数传给构造器,执行;
    
    3.如果构造器没有手动返回对象,则返回第一步创建的对象
    

    5.箭头函数绑定

    箭头函数中没有this,箭头函数的this指向取决于外层作用域中的this,外层作用域或函数的this指向谁,箭头函数中的this便指向谁。
    还有一个特点:一旦箭头函数的this绑定成功,也无法被再次修改,有点硬绑定的意思。

      

    this绑定的优先级:

    我们先介绍前四种this绑定规则,那么问题来了,如果一个函数调用存在多种绑定方法,this最终指向谁呢?这里我们直接先上答案,this绑定优先级为:
    
    显式绑定 > 隐式绑定 > 默认绑定
    
    new绑定 > 隐式绑定 > 默认绑定
    

      

    参考:https://www.cnblogs.com/echolun/p/11962610.html

  • 相关阅读:
    ASP.NET Forms验证(自定义、角色提供程序)B
    SPSiteDataQuery使用说明
    moss2010 仿内容查询部件代码
    微软CRM系统二次开发步骤以及注意事项
    sap ABAP关于Data Reference的使用FIELDSYMBOLS
    selectoptions 模拟parmater
    ABAP "FOR ALL ENTRIES IN" 使用指南
    ABAP/4中参数的传递
    用接口CL_GUI_FRONTEND_SERVICES弹出选择文件对话框
    深入浅出理解索引结构
  • 原文地址:https://www.cnblogs.com/liumcb/p/14062069.html
Copyright © 2011-2022 走看看