this、call、apply、bind
1、在浏览器里,在全局范围内this 指向window对象;
2、在函数中,this永远指向最后调用他的那个对象;
3、call、apply、bind中的this被强绑定在指定的那个对象上;
4、构造函数中,this指向new出来的那个新的对象;
5、箭头函数中this比较特殊,箭头函数this为父作用域的this,不是调用时的this
全局中的this
在浏览器里,在全局范围内:
this等价于window对象;
用var声明一个变量和给this或者window添加属性是等价的;
如果你在声明一个变量的时候没有使用var或者let、const(es6),你就是在给全局的this添加或者改变属性值。
函数中的 this
对于函数中的this的指向问题,有一句话很好用:运行时this永远指向最后调用它的那个对象。
构造函数中的this
所谓构造函数,就是通过这个函数生成一个新对象(object)。当一个函数作为构造器使用时(通过 new 关键字), 它的 this 值绑定到新创建的那个对象。如果没使用 new 关键字, 那么他就只是一个普通的函数, this 将指向 window 对象。
这又是另一个经典话题:new 的过程
class中的this
构造函数里的 this指向新创建的 类实例。当我们调用 batman.dialogue()时, dialogue()作为方法被调用, batman是它的接收器。
但是如果我们将 dialogue()方法的引用存储起来,并稍后将其作为函数调用,我们会丢失该方法的接收器,此时 this参数指向 undefined。
call、apply和bind中的this
call、apply、bind 被称之为 this 的强绑定,用来改变函数执行时的this指向,目前所有关于它们的运用,都是基于这一点来进行的。
apply()
apply()方法接收两个参数:一个是在其中运行函数的作用域,另一个是参数数组。其中,第二个参数可以是 Array 的实例,也可以是arguments 对象。
call()
call()方法与 apply()方法的作用相同,它们的唯一区别在于接收参数的方式不同。在使用call()方法时,传递给函数的参数必须逐个列举出来。
call()方法与 apply()方法返回的结果是完全相同的,至于是使用 apply()还是 call(),完全取决于你采取哪种给函数传递参数的方式最方便。
call和apply区别:
Call和 apply 都可以改变this,会让函数立即执行
区别是传参的时候call 传的是字符串,apply传的是数组
bind()
bind()方法会创建一个函数的实例,其 this 值会被绑定到传给 bind()函数的值。意思就是 bind() 会返回一个新函数。
bind 改变this,不会改变数据。不会让函数立刻执行,调用的地方加一个括号