普通函数和箭头函数的 this
还是一道经典题目,下面的这段代码的输出是什么?(为了方便解释,输出放在了注释中)
1 | function fn() { |
其实诀窍很简单,常见的基本是 3 种情况:es5 普通函数、es6 的箭头函数以及通过bind
改变过上下文返回的新函数。
① es5 普通函数:
- 函数被直接调用,上下文一定是
window
- 函数作为对象属性被调用,例如:
obj.foo()
,上下文就是对象本身obj
- 通过
new
调用,this
绑定在返回的实例上
② es6 箭头函数: 它本身没有this
,会沿着作用域向上寻找,直到global
/ window
。请看下面的这段代码:
1 | function run() { |
③ bind 绑定上下文返回的新函数:就是被第一个 bind 绑定的上下文,而且 bind 对“箭头函数”无效。请看下面的这段代码:
1 | function run() { |
最后,再说说这几种方法的优先级:new > bind > 对象调用 > 直接调用
至此,这道题目的输出就说可以解释明白了。