关于this指向问题,如今自己学习归纳后总结出以下几个方面:
1,在全局作用域下,this指向window
<script>
console.log(this) // 全局作用域下,this指向window
</script>
2,普通函数中,this指向全局window
<script>
function foo () {
console.log(this) // window
}
foo()
</script>
3,使用严格模式下,普通函数中的this指向未定义(undefined)
<script>
"use strict";
function foo () {
console.log(this) // undefined
}
foo()
</script>
4, 如果是在全局里定义箭头函数,那函数里this指向的是window
<script>
const foo = () => {
console.log(this) // window
}
foo()
</script>
5,私有作用域
私有作用域里面的 this 不看函数在哪儿定义 只看函数怎么调用
a.如果是函数名() 直接调用 this => window
b.如果 是 **.函数名() 调用 this => .前面的那个东西
c.如果是事件处理函数 this => 事件源
<script>
var obj = {
name:'小李',
fn:function(){
console.log(this) // 指向obj对象
}
}
obj.fn()
var obj = {
fun:function(){
console.log(this)
}
}
var a = obj.fun
a() // window
obj.fun() // obj对象
</script>
6, 在构造函数中,this指向实例对象
## 改变this指向的三种方式call,apply,bind
改变this指向通常会call , apply , bind 三种方式,现在归纳总结以下这三种的用法以及他们之间的区别。
Ⅰ call()
第一个参数就是this的指向
除了第一个参数之外,有n个参数
会立即调用函数
例: fn.call(obj,123,321,123456)
Ⅱ apply()
第一个参数也是this指向
第二个参数,是一个数组形式,数组里的每一项分别给函数传参
会立即调用函数
例: fn.apply(obj,[123,456,789])
Ⅲ bind
第一个参数是this指向
不会立即调用函数,会返回一个已经改变this指向的新函数
语法和call一模一样,区别在于立即执行还是等待执行,bind不兼容IE6~8
三者的相同点: 都能改变this的指向。
三者之间的区别:
① call 和 apply是会立即执行函数,而bind不会立即执行函数
② call 和 apply 在传参上的区别:call从第二个参数开始以参数列表的形式展现,apply则是把除了改变上下文对象的参数放在一个数组里面作为它的第二个参数。