This是一个关键字,它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。
this 是在函数被调用时确定的,它的指向完全取决于函数调用的地方,而不是它被声明的地方(除箭头函数外)。当一个函数被调用时,会创建一个执行上下文,它包含函数在哪里被调用(调用栈)、函数的调用方式、传入的参数等信息,this 就是这个记录的一个属性,它会在函数执行的过程中被用到。
(this要在执行时确认值,定义时无法确认,this永远指向一个对象,this的指向完全取决于函数调用的位置。)
(1)作为纯函数调用this======》指window
(2)对象方法调用this======》指该方法所属对象
(3)构造函数调用this=======》实例对象
(4)事件绑定方法调用this=======》绑定事件对象
(5)定时器函数调用this=========》window
(6)立即执行函数调用this==========》window
(7)改变函数内部this指向======》cal(),apply(),bind()
一:改变this三种方式
(1)call方法:调用一个对象。
call(thisScope,arg1,arg2.......)
(2)apply方法:调用一个函数
apply(thisScope,[arg1,arg2,arg3........])
(3)bind方法:不会调用函数,改变函数内部this指向,返回的是原函数改变this之后产生的新函数。
应用:如果只是想改变this指向,并且不想调用这个函数的时候,可以使用bind。
fn.bind(thisScope,arg1,arg2........)
fn是bind返回的新函数
(4)call,apply,bind三者异同
共同点:都可以改变this指向
不同点:
all 和 apply 会调用函数, 并且改变函数内部this指向.
call 和 apply传递的参数不一样,call传递参数使用逗号隔开,apply使用数组传递
bind 不会调用函数, 可以改变函数内部this指向.
应用场景:
call 经常做继承.
apply经常跟数组有关系. 比如借助于数学对象实现数组最大值最小值
bind 不调用函数,但是还想改变this指向. 比如改变定时器内部的this指向.
二:严格模式下this指向