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

  • 相关阅读:
    x64 平台开发 Mapxtreme 编译错误
    hdu 4305 Lightning
    Ural 1627 Join(生成树计数)
    poj 2104 Kth Number(可持久化线段树)
    ural 1651 Shortest Subchain
    hdu 4351 Digital root
    hdu 3221 Bruteforce Algorithm
    poj 2892 Tunnel Warfare (Splay Tree instead of Segment Tree)
    hdu 4031 Attack(BIT)
    LightOJ 1277 Looking for a Subsequence
  • 原文地址:https://www.cnblogs.com/liumcb/p/14062069.html
Copyright © 2011-2022 走看看