js中this的指向问题
JS中this的指向不是指定义它的位置,而是谁定义它,它指向谁。简单的理解就是当前this所在的函数有没有执行对象,有的话就指向这个执行对象。我整理以下四点来说明this的指向。
一、默认绑定,没有被明确隶属对象执行的函数,函数中的this在非严格模式下指向window,严格模式下指向指向undefined。
二、隐式绑定,被明确隶属对象执行的函数,函数中的this指向执行对象。
隐式丢失:如果作为参数,传到另一个函数中,那么丢失原本的对象,变成window
三、强制绑定,利用函数的方法(call,apply,bind),改成谁,this就指向谁。
1、call方法的使用方式:
语法:函数.call()
参数:第一个参数是,修改之后的this指向
后面所有参数:表示向函数中正常传递的实参,可以省略,也可以传多个
功能:修改原函数中的this指向,切记仅仅是在当前call执行的时候,修改了
返回值:原函数的返回值
是否修改了原函数:没有修改
this的内容,必须是对象,如果不是,强行转成对象,但是依然符合之前数据类型的使用规则。
2、apply方法的使用方式:
语法:函数.apply()
参数:第一个参数是,修改之后的this指向
第二个参数是:数组,这个数组中所有的数据,被自动展开之后,传入了原函数,可以省略
功能:修改原函数中的this指向,切记仅仅是在当前apply执行的时候,修改了
返回值:原函数的返回值
是否修改了原函数:没有修改
3、 bind方法的使用方式:
语法:函数.bind()
参数:第一个参数是,修改之后的this指向
后面所有参数:表示向函数中正常传递的实参,可以省略,也可以传多个
功能:修改原函数中的this指向,切记仅仅是在当前bind执行的时候,修改了
返回值:修改了this之后的新函数
是否修改了原函数:没有修改
call,apply和bind的区别
(1) call和apply会自动执行,执行之后的返回值是原函数的返回值
(2)bind执行之后,会得到一个新函数,如果需要,新函数需要手动执行
四、用new绑定,函数被new执行后,函数内部的this会指向new出来的实例
最后我们可以领会到this是永远跟着当前函数走,this指向的永远是一个对象,在执行时才能确定指向。