This在不同情况下的说明
This是一个指针,指向某个对象,是在创建当前函数时,自动生成的,同时生成的还有arguments对象。
- This的指向问题
- 当直接调用一个函数,即函数名(),函数中的this,指向window对象
- 当函数作为事件的处理函数时,其中的this,指向触发该函数的对象。
- 当作为构造函数时,其中的this指向实例化的那个对象 arguments是形参对象,里面存放的时传进去的形参,形参是以伪数组的形式存放的
直接写 函数名(“()”),代表的是window在调用这个函数,并且它里面的this指的就是window对象。
构造器指的就是构造函数
什么是this指针?
解答:在javascript中,创建函数时,系统默认生成的两个隐式参数之一(另一个是arguments)
This指针指向与该函数调用相关联的一个对象,该对象被称为“函数上下文”。
This指针的指向
Js中有四种调用模式——方法、函数、构造器、apply调用模式,他们在初始化this时候是不一样的。
- 方法模式 简单说就是使用点表达式或是下标表达式来调用,这里定然是有对象的,这种情况下this的绑定发生在调用的时候,绑的自然是调它的那个对象。
- 函数模式 这个更简单了。函数名加调用运算符(“()”)。不过要小心,这个this绑的可是全局对象,不管你写哪了。(可以理解成,你不给我指明了,我就自己给它加个全局对象)
- 构造器调用模式 就是new来调用的,new的时候this就绑定到新对象上了
- Apply.call调用模式apply,call是函数对象的方法,你想把谁绑定到this,就直接把它作为第一个参数传给apply或call就好了
- 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 的指向,不会调用方法,传参后面再讲