JavaScript的this
this
关键字,也称为函数的“上下文”或“范围”,是一个强大的也令人迷惑的概念。本文帮你捋清思路。
this
关键字可以引用函数的“执行上下文”。一个巧妙的说法是,this
指向了调用函数所属的对象。
1 | // `this`是函数的隐性参数 |
需要重点关注的是,JavaScript的函数也是普通的变量,this
是可以改变的。一个常见的搞混this
的场景:把函数赋给一个对象,但调用函数时不用对象调用。这种俗称函数“丢失上下文”。
1 | const fn = function() { |
简言之:this
是函数调用时的隐性参数,当属于某个对象的函数调用时,this
就是这个对象。
类
在ES6的类方法中,经常能见到this
。在一个类方法中,this
指向了调用方法所属的对象实例。
1 | class MyClass { |
箭头函数
箭头函数不同于其他函数,它属于词法上下文。这意味着无论是以何种方式调用箭头函数,箭头函数中的this
与箭头函数外的保持一致。
1 | const arrow = () => this; |
bind()、call()和apply()
每个JavaScript函数都有Function#call()
函数和Function#apply()
函数,可以不必绑定对象就能指定this
的值。call()
和apply()
将隐性参数this
变成了显性参数。
另外Function#bind()
函数可以创建一个预设this
的函数副本。
1 | const fn = function() { |