this的指向、call、applay、bind

69 阅读3分钟

This在不同情况下的说明

This是一个指针,指向某个对象,是在创建当前函数时,自动生成的,同时生成的还有arguments对象。

  1.  This的指向问题
  2. 当直接调用一个函数,即函数名(),函数中的this,指向window对象
  3. 当函数作为事件的处理函数时,其中的this,指向触发该函数的对象。
  4. 当作为构造函数时,其中的this指向实例化的那个对象 arguments是形参对象,里面存放的时传进去的形参,形参是以伪数组的形式存放的

直接写 函数名(“()”),代表的是window在调用这个函数,并且它里面的this指的就是window对象。

构造器指的就是构造函数

什么是this指针?

解答:在javascript中,创建函数时,系统默认生成的两个隐式参数之一(另一个是arguments)

This指针指向与该函数调用相关联的一个对象,该对象被称为“函数上下文”。

This指针的指向

Js中有四种调用模式——方法、函数、构造器、apply调用模式,他们在初始化this时候是不一样的。

  1. 方法模式 简单说就是使用点表达式或是下标表达式来调用,这里定然是有对象的,这种情况下this的绑定发生在调用的时候,绑的自然是调它的那个对象。
  2. 函数模式 这个更简单了。函数名加调用运算符(“()”)。不过要小心,这个this绑的可是全局对象,不管你写哪了。(可以理解成,你不给我指明了,我就自己给它加个全局对象)
  3. 构造器调用模式 就是new来调用的,new的时候this就绑定到新对象上了
  4. Apply.call调用模式apply,call是函数对象的方法,你想把谁绑定到this,就直接把它作为第一个参数传给apply或call就好了
  5. Es6里面this指向固定化,始终指向外部对象,因为箭头函数没有this,因此它自身不也能进行new实例化,同时也不能使用call,apply.bind等方法来改变this的指向。

前四种只有在调用时this才会真正的生成到底是谁

两个对象之间做==,===比较的是两个对象在内存里的地址

call()方法

语法:对象名.方法名.call(thisObj,arg1,arg2,argnN)

定义:调用一个对象的一个方法,以另一个对象替换当前对象

说明:call方法可以用来替换另一个对象调用一个方法,call方法可将一个函数的对象上下文从初始的上下文改变由thisObj指定的新对象

 

apply方法

语法:对象名(被替换的对象).方法名.apply(thisObj,[argArray])

对象名(被替换的对象).方法名.apply(替换的对象,[实参1,实参2…])

定义:调用一个对象的一个方法,以另一个对象替换当前对象

说明:1、如果applyArray不是一个有效的数组或者不是arguments对象,那么将导致一个typeError。

      2、如果没有提供argArray和thisObj任何一个参数,那么Global对象将被用作thisObj,并且无法被传递任何参数

 

bind也可以改变this指向,但他们有区别

语法:对象名.方法名.bind(this)

bind只会改变方法当中this 的指向,不会调用方法,传参后面再讲