前言
本文会分别介绍this在普通函数、箭头函数、普通函数的匿名函数、DOM事件处理函数中this的指向。 写这个文章的出发点在于,首先巩固自己对this的理解,也想着借此锻炼自己的写作能力,提升自己对知识的输出能力。
普通函数的this指向
在普通函数中this的指向主要是由函数调用的方式决定,下面对这几种调用方式做的枚举。
全局作用域直接调用普通函数,this的指向?
在全局作用域中直接调用普通函数,函数中的this指向wnidow对象,从以下示例可以看出。
在全局作用域中调用了test()函数,this与window对象严格相等,说明了this指向了window
使用对象调用普通函数,this的指向?
在obj对象中声明了fun函数,在全局中通过obj.fun()调用,通过输出结果可以看出fun函数中的this与obj严格相等,从这可以看出函数中this指向了obj(函数中的obj通过作用域链获取)。小tip: 如果函数通过多层对象调用,this指向最靠近调用函数的对象,例如: obj1.obj2.fun(),在这里fun函数中的this指向了obj2。
使用apply、call、bind手动改变函数中this指向
使用apply改变
从图中可以看出,函数中this指向了obj
使用call改变
从图中可以看出,函数中this指向了testObj
使用bind改变
从图中可以看出,函数中this指向了testObj
apply、call、bind区别
- apply与call的主要区别是传入形参的方式不同,apply以数组的方式传入,call是单个单个的传入的,示例: fun.apply(obj, [1,2,3]), fun.call(obj, 1, 2, 3)
- bind与apply、bind的区别,使用apply、call调用函数后返回undefined,且会立即执行函数。使用bind返回值是一个函数,不会立即执行,它返回的函数中this指向和形参的值是固定的,不会因为调用方式而改变,可以从下面的示例看出bind的特性。
箭头函数的this指向
在箭头函数中,this与封闭词法环境的this保持一致。词法环境是在定义时决定的,所以箭头函数中this的指向在它定义时就被确定了。主要分下面两种情况
- 普通函数中的箭头函数this指向该普通函数的this
2. 对象中的箭头函数this指向window
普通函数的匿名函数中的this指向
普通函数匿名函数中的this指向始终指向window 例子1(直接在全局作用域调用匿名函数):
例子2(在普通函数中调用匿名函数):
DOM事件处理函数中的this指向
当函数被用作事件处理函数时,他的this指向触发事件的元素,大家可以看看下面的例子,动手试试。
html:
<div id="app">hello world</div>
js:
function test(e) {
console.log(this === e.currentTarget);
}
document.getElementById('app').addEventListener('click',test)
小结
分享的可能不全,欢迎指正。
我是ZhiWen, 我们下一期见!!!