JavaScript 中 this 的指向根据上下文及使用方式而有所不同。
全局上下文 Global Context
在全局上下文(不在函数体内)中总指向全局对象,如在浏览器中是 window
,在 Node.js 则是 global
。
函数上下文 Function Context
- 简单调用
- 严格模式:
undefined
- 非严格模式:全局对象
- 可用
call
或apply
来改变this
- 严格模式:
- 作为对象的方法:指向直接所在的对象,如
a.b.c()
中c
的this
指向b
,适用于普通的对象、原型链方法和getter
/setter
。 - 作为构造函数,指向正在构建的对象
- 作为 DOM 事件处理函数,指向触发事件的元素(指的是外层函数,如果是多层,遵循其余规则)
bind
:用f.bind(object)
来返回新的绑定this
的函数,不论怎么调用,如通过对象方法调用、call
或apply
都不会改变this
。再次 bind 也不会改变。- 箭头函数(arrow function):
this
指向词法上下文(实际运行生成箭头函数时上下文)的this
,不会被调用方式改变,但会因生成方式而不同。
var obj = {
bar: function() {
var x = (() => this);
return x;
}
};
var fn = obj.bar();
console.log(fn() === obj); // true
var fn2 = obj.bar;
console.log(fn2()() == window); // true