js中this的绑定情况以及如何改变this的指向

友情提示:this只有在执行的时候才能确认,定义时无法被确认
this的介绍:
this是一个关键字,类似于变量但不是变量,也不是属性名,JavaScript的语法不允许给this赋值。和变量不同,关键字this没有作用域的限制,嵌套的函数不会从调用它的函数中继承this。如果嵌套函数作为方法调用,其this的值指向调用它的对象。如果嵌套函数作为函数调用,其this值不是全局对象就是undefined(非严格模式下是全局对象(即window对象),严格模式下是undefined)。很多人误以为调用嵌套函数时,this会指向调用外层函数的上下文。如果你想访问这个外部函数的this值,需要将this的值保存在一个变量中,这个变量和内部函数都同在一个作用域内。
this的绑定:

  1. 默认绑定(严格模式下,不能将全局对象用于默认绑定)
    没有明确隶属对象(明确主人)的函数,被直接执行,一般都是window
    在这里插入图片描述
  2. 隐士绑定
    有所属对象的函数,被执行时,一般是当前函数的所属对象;隐士绑定中存在着隐士丢失。
    在这里插入图片描述
    在这里插入图片描述
    隐士丢失:不管这个函数是谁的,有没有所属对象,只要作为参数传递,通过参数执行这个函数(参数中的这个函数称为回调函数),一般情况下都是window
    在这里插入图片描述
    注意:不是所有的回调函数中的this都指向window,某些特殊情况下(在事件监听式绑定中),被系统修改了
    在这里插入图片描述
  3. new绑定
    如果函数或者方法调用之前带有关键字new,它就构成构造函数调用。对于this绑定来说,称为new绑定。
    在这里插入图片描述
    在这里插入图片描述
    new关键字的内部执行原理:
    1> 自动创建一个新对象,在内存中
    2> 改变了函数内部的this的指向,改成了第一步创建的新对象
    3> 执行函数内部的代码,并且将第一步创建的对象的__proto__与实例的prototype进行了关联
    4> 检查当前函数是否主动返回对象,如果没有,则返回第一步创建的新对象
  4. 显示绑定
    采用call()和apply(),通过传入一个对象(若为基本类型,会被封装函数转为对象),将this绑定到该对象。
    如何改变this的指向
    this在函数中,修改函数的指向,配合函数的方法实现修改:以下是几种方法的使用方式:
    call方法的使用方式
    语法:函数名.call()
    参数:第一个参数是,修改之后的this指向;后面的所有参数:表示函数中正常传递的实参,可以省略,也可以传多个
    功能:修改原函数中的this指向,但是只是在当前call执行的时候,修改了
    返回值:元函数的返回值
    是否修改了原函数:没有修改
    在这里插入图片描述
    在这里插入图片描述
    apply方法的使用方式:
    语法:函数.apply()
    参数:第一个参数是:修改之后的this指向
    第二个参数是:数组,这个数组中所有的数据,被自动展开之后,整体传入了原函数,可以省略,省略时为undefined
    功能:修改原函数中的this指向,但是只是在当前apply执行的时候修改了
    返回值:原函数的返回值
    是否修改了原函数:没有修改原函数
    在这里插入图片描述
    在这里插入图片描述
    bind方法的使用方式:
    语法:函数名.bind()
    参数:第一个参数是:修改之后的this指向
    后面的所有参数:表示想函数中正常传递的实参,可以省略,也可以传多个
    返回值:修改了this之后的新函数
    是否修改了原函数:没有修改
    在这里插入图片描述
    在这里插入图片描述
发布了9 篇原创文章 · 获赞 15 · 访问量 286

猜你喜欢

转载自blog.csdn.net/qq_44732010/article/details/104651743