在JS的各种语法中,this的理解是十分重要的,否则很容易在调用函数时出现错误的结果(血泪教训),所以今天特意记录一下,完善一下自身对于this的认知。
首先,明确一个概念,this是在函数被调用时才发生的绑定(箭头函数除外),也就是说this具体指向什么,取决于你是怎么调用函数。这里给出本文列出的所有this指向结论
- 以函数形式调用,this指向全局window对象
- 以对象的方法形式调用,this指向调用方法的对象
- 以构造函数的形式调用,this指向新创建的那个对象
- 使用call()和apply()调用时,this指向括号内传递的那个对象参数
- setTimeout/setInterval/匿名函数执行,this默认指向window对象
- Function.prototype.bind()方式调用,this指向bind绑定的对象
- 箭头函数本身无this,在箭头函数中使用this时,他将选择上层作用域的this作为指向
以下的详细介绍包含但不限于以上的各种情况。
普通函数调用
这种方式也是最简单地调用,即函数作为普通函数来调用,如下:
function func(){
console.log(this)
}
func() // 输出结果Window对象
以上代码可以看出普通方式调用的函数,this指向的是全局的window对象。换种角度
可以理解成普通方式调用等效于window.func(),是window对象调用了该函数,所以this指向了window
对象方法调用
对象方法调用指的就是该函数在对象中被调用,一般是作为对象的属性值,例子如下:
var name = '全局的名儿'
var obj = {
name: '对象的名儿',
show: function() {
console.log(this.name);
}
}
obj.show() // 输出 对象的名儿
var func = obj.show;
func() // 输出 全局的名儿
这种作为对象方法来调用时,this就会指向调用该方法的对象,即例子中的obj,所以会打印出对象中的name属性。但是当对象方法被赋值给一个变量并使用普通函数方式调用时,此时this指向的是window对象,因为func通过赋值后就相当定义了func=function() {console.log(this.name);},之后再普通调用就等同于第一种