JS中的this 指向和 call、apply、bind 三者的区别。【面试题】
1.在浏览器里,在全局范围内this 指向window对象
2.在函数中,this永远指向最后调用他的那个对象
3.构造函数中,this指向new出来的那个新的对象
4.call、apply、bind中的this被强绑定在指定的那个对象上
5.箭头函数中this比较特殊,箭头函数this为父作用域的this,不是调用时的this.要知道前四种方式,都是调用时确定,也就是动态的,而箭头函数的this指向是静态的,声明的时候就确定了下来
6.apply、call、bind都是js给函数内置的一些API,调用他们可以为函数指定this的执行,同时也可以传参。
定义:
apply():调用一个对象的一个方法,用另一个对象替换当前对象,例如:B.apply(A,arguments);即A对象应用B对象的方法。这个方法接受两个参数,一是作用域,二是参数(可以是数组也可以是arguments对象)。
call():调用一个对象的一个方法,用另一个对象替换当前对象,例如:B.call(A,args1,args2,···);即A对象调用用B对象的方法。apply 和 call 一样,只是接受参数的方式不一样
bind()
这个方法会创建一个函数的实例,其this值会被绑定给传入bind()函数的值。
作用:
-
call 、 apply 、bind 均能改变this 指向
-
apply 每次执行产生一个新函数,call、apply 不会
-
call ,bind 接收多个参数绑定到函数,参数单一传入,apply 接收方式为数组
-
实现继承
-
借用别的对象的方法
-
单纯的调用函数
apply、call和bind的区别:
相似之处:
①都是用来改变函数的this对象的指向的;
②第一个参数都是this要指向的对象;
③都可以利用后续参数传参;
区别:
①apply、call、bind的第一个参数都是this要指向的对象,但apply只有两个参数,第二个参数为一个数组,需要传输的参数值须全部放到数组中。而call、bind一样,参数用逗号分开。
②apply、call返回的的是一个值,而bind返回的是一个函数,需要执行这个函数才会得到值。