this
指向总结
概念:this
是运行环境下的一个系统变量,由于this
在不同的执行环境下有不同的值,所以在使用this
时,多加注意(使用this
之前,先打印)
- 在全局作用域下,
this
默认指向window
(前端运行环境下)- 后端运行环境是空对象
- 在事件函数中,
this
指向绑定事件的目标 - 在对象中,
this
指向它所在的对象本身 - 在构造函数中,
this
指向构造函数创建的对象 - 特殊情况:在函数嵌套时
- 内层的函数
this
不会继承外层函数this
的值,会被还原成window
- 如果想让内层函数的
this
和外层函数的this
统一指向,内层函数请使用箭头函数
- 内层的函数
- 在
ajax
回调函数中,this
指向window
修改this
指向的三种方法
function add(a, b) {
console.log(this, a+b )
}
add(3, 4)
-
通过
call
函数修改:用函数直接调用call()
,第一个参数是this
修改后的指向(支持引用类型,如果传入值类型会自动装箱),后边的参数是函数add
的原始参数,调用call
时会直接执行add
函数。add.call('李四', 5, 6)
-
通过
apply
函数修改:用函数直接调用apply()
,第一个参数是this
修改后的指向(支持引用类型,如果传入值类型会自动装箱),后边的参数是函数add
的原始参数所在数组,调用apply
时会直接执行add
函数。add.apply(false, [5, 6])
-
通过
bind
函数修改:用函数直接调用bind()
,第一个参数是this
修改后的指向(支持引用类型,如果传入值类型会自动装箱),后边的参数是函数add
的原始参数,调用bind
时不会直接执行add
函数。var obj = { name: '王二', age: 20 }
调用
bind
后会返回一个新的函数var newAdd = add.bind( obj, 5, 6)
newAdd()
call
、apply
和bind
的使用场景
call
适合在调用函数时修改this
指向,直接使用call
或apply
修改即可bind
适合在修改this
指向时,不立即调用函数,而是等时机成熟时再调用的情况,如:计时器、ajax
请求登录异步回调函数的修改
再次声明:在函数潜逃的情况下,如果内层函数中的this指向的是外层函数中的this时,更建议使用箭头函数,因为箭头函数没有自己的this,箭头函数中的this指向其上下文中的this