在JavaScript中,this
关键字是一个非常重要的概念,它指向当前执行代码的环境对象。this
的值在函数被调用时确定,而不是在函数定义时确定。this
的作用域取决于函数的调用方式。以下是几种常见的情况:
this
在全局执行上下文中(即任何函数体外部),this
指向全局对象。在浏览器中,这通常是window
对象。
console.log(this.document === document); // true
this.a = 37;
console.log(window.a); // 37
this
在普通函数中,this
的值取决于函数的调用方式。
如果函数是直接调用的,this
通常指向全局对象(在严格模式下是undefined
)。
function f1(){
return this;
}
f1() === window; // 非严格模式下为true
如果函数作为对象的方法被调用,this
指向调用该方法的对象。
var o = {
prop: 37,
f: function() {
return this.prop;
}
};
console.log(o.f()); // logs 37
this
当函数用作构造函数(使用new
关键字)时,this
指向新创建的对象实例。
function C(){
this.a = 37;
}
var o = new C();
console.log(o.a); // logs 37
.call()
和.apply()
调用函数通过.call()
或.apply()
方法调用函数时,可以显式指定this
的值。
function f(){
return this.a;
}
var o = {a: 37};
console.log(f.call(o)); // logs 37
this
箭头函数没有自己的this
绑定,它会捕获其所在上下文的this
值。
var o = {
a: 37,
f: function() {
var arrow = () => this.a;
return arrow();
}
};
console.log(o.f()); // logs 37
this
来引用对象的属性和方法。this
来初始化新对象的属性。this
来引用触发事件的元素。this
的值可能会改变,可以使用箭头函数或者.bind()
方法来保持this
的正确引用。问题:在回调函数中this
的值不是预期的对象。
解决方法:
this
值。.bind(this)
来创建一个新函数,其this
值被永久绑定到指定的对象。var o = {
a: 37,
f: function() {
setTimeout(function() {
console.log(this.a); // undefined
}.bind(this), 100);
}
};
o.f(); // logs 37
理解this
的工作原理对于编写高质量的JavaScript代码至关重要。通过掌握不同情况下的this
行为,可以避免许多常见的陷阱和错误。
领取专属 10元无门槛券
手把手带您无忧上云