函数的调用方法决定了this的指向
-
普通函数定义(指向window)
function A(){ console.log(this) } A()
-
构造函数定义(指向实例对象)
function people(name,age){ this.name=name this.age=age } var people1=people('A',19) var people2=people('B',19)
-
对象方法调用(指向这个对象)
var obj={ fn:function(){ console.log(this) } } obj.fn()
-
事件绑定的方法(指向绑定的元素)
-
定时器(指向window)
改变this指向的方法
-
call()
语法:call(thisobj,[argq,arg2])
定义:调用一个对象的一个方法,以另一个对象替换当前对象
括号里面的原本的对象改为call()前面的对象、即用thisobj代替call前面的东西,最终用thisobj这个对象去执行call前面的方法。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。 第二个参数及以后表示传进去的实参
-
apply()
语法:apply(thisobj,[argArray])
定义:应用某一个对象的一个方法,用别另一个对象替换当前对象
说明:
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。
-
bind()
语法:bind(thisobj,参数列表(但是这个参数列表可以分多次传入))。
说明:返回有指定的 this 值 和初始化参数改变的原函数拷贝
function fn(...args){
console.log(this,args);
}
let obj = {
name:"A"
}
const bindFn = fn.bind(obj);
bindFn(1,2)
fn(1,2)
区别:
-
call和apply改变this指向后,直接进行函数调用
-
bind则是仅做改变,不做执行。