1、js的this指向问题
this的指向是动态的,取决于函数的调用方式
1)在全局作用域中,this指向全局对象(如浏览器中的window对象)。
2)在函数中,this的指向取决于函数的调用方式。如果是作为对象的方法调用,则this指向调用该方法的对象。如果是通过函数名直接调用,则this指向全局对象。
3)在箭头函数中,this指向定义时的对象,而不是运行时绑定。
4)在事件处理函数中,this指向触发事件的元素。
5)在构造函数中,this指向正在创建的实例对象。
6)在方法链中,this的指向取决于前一个函数返回的对象。
2、call,apply,bind的区别【动态的修改当前函数内部环境对象this的指向】
相同点:
作用相同,都是动态修改this指向;都不会修改原先函数的this指向。
不同点:
(1)执行方式不同:
call和apply是改变后页面加载之后就立即执行,是同步代码。
bind是异步代码,改变后不会立即执行;而是返回一个新的函数。
(2)传参方式不同:
call和bind传参是一个一个逐一传入,不能使用剩余参数的方式传参。
apply可以使用数组的方式传入的,只要是数组方式就可以使用剩余参数的方式传入。
(3)修改this的性质不同:
call、apply只是临时的修改一次,也就是call和apply方法的那一次;当再次调用原函数的时候,它的指向还是原来的指向。
bind是永久修改函数this指向,但是它修改的不是原来的函数;而是返回一个修改过后新的函数,此函数的this永远被改变了,绑定了就修改不了。