不是,JavaScript中的this
关键字并不表示“this page”,而是指向函数正在执行的上下文。 在不同的情况下,this
可以指向不同的对象:在全局执行上下文中,this
指向全局对象;在对象的方法中,this
指向调用该方法的对象;在事件处理函数中,this
通常指向接收事件的元素;在严格模式下,this
的值为undefined
,除非被明确设置;在箭头函数中,this
被设置为它在定义时的上下文,并不会随着函数的调用而改变。
一、全局上下文中的 this
在JavaScript代码的最顶层,也即非任何函数内部的位置,用this
会指向全局对象。在浏览器中,全局对象通常是window
对象。因此,在全局上下文中,this
有时可以与window
互换使用。但在Node.js中,全局对象并不是window
,而是global
。
console.log(this === window); // 在浏览器中返回true
var a = 37;
console.log(window.a); // 输出37
二、函数上下文中的 this
在函数内部,this
的值取决于函数的调用方式。如果是简单调用,即直接调用函数而不是作为一个对象的方法或通过new
关键字调用,非严格模式下this
会指向全局对象,而在严格模式下,this
会是undefined
。
function f1(){
return this;
}
// 在浏览器的非严格模式中,这将返回全局对象
f1() === window; // true
// 在严格模式下,则返回undefined
function f2(){
'use strict';
return this;
}
f2() === undefined; // true
三、对象方法中的 this
当函数作为对象里的方法被调用时,this
将指向那个对象。
var obj = {
prop: 37,
f: function() {
return this.prop;
}
};
console.log(obj.f()); // 输出37
这里f
作为obj
的一个属性被调用,因此函数内的this
指向obj
对象。
四、构造函数中的 this
构造函数内部的this
指的是正在被创建的新对象。当你使用new
关键字调用函数时,该函数就会作为构造函数去创建一个新实例,this
就会绑定到这个新实例上。
function Gadget(name, color) {
this.name = name;
this.color = color;
this.whatAreYou = function(){
return 'I am a ' + this.color + ' ' + this.name;
}
}
var newGad = new Gadget('iPhone', 'Silver');
console.log(newGad.whatAreYou()); // 输出"I am a Silver iPhone"
五、绑定 this
JavaScript 提供了 .bind()
、.call()
、和 .apply()
方法来设置函数的this
值,无论函数如何被调用。
.bind()
方法创建一个新的函数,你可以传入参数列表作为新函数被调用时this
的前置参数。
function f(){
return this.a;
}
var g = f.bind({a: 'azerty'});
console.log(g()); // 输出 'azerty'
var o = {a: 37, f: f, g: g};
console.log(o.f(), o.g()); // 输出 '37, azerty'
- 使用
.call()
和.apply()
方法,你可以直接设置函数调用时的this
值,并且立即执行函数。
function add(c, d){
return this.a + this.b + c + d;
}
var o = {a: 1, b: 3};
add.call(o, 5, 7); // 1 + 3 + 5 + 7 = 16
add.apply(o, [10, 20]); // 1 + 3 + 10 + 20 = 34
六、箭头函数中的 this
箭头函数不绑定自己的this
,它们在自己的作用域中继承this
。以下代码示例展示了箭头函数与普通函数的this
行为差异。
function NormalFunction() {
this.value = 20;
setTimeout(function() {
console.log(this.value); // 在非严格模式下输出undefined或全局对象的value属性值,在严格模式下报错
}, 100);
}
function ArrowFunction() {
this.value = 20;
setTimeout(() => {
console.log(this.value); // 输出20
}, 100);
}
new NormalFunction();
new ArrowFunction();
在箭头函数实例中,setTimeout
里的函数继承了外围作用域ArrowFunction
中的this
。与之相反,在传统函数中,setTimeout
中的函数内部的this
值指向全局对象,或者在严格模式下是undefined
。
总而言之,this
在JavaScript中是一个复杂的概念,其指向依赖于函数调用的上下文。正确理解和运用this
可以帮你避免代码中的错误,并更有效地编写程序。
相关问答FAQs:
1. 在JavaScript中,this关键字表示什么?
this关键字在JavaScript中用于指代当前执行上下文中的对象。它可以根据当前的调用环境而变化,可能指向不同的对象。例如,在函数中,this通常指向函数被调用时的对象,而在全局作用域中,this指向全局对象(通常是浏览器中的window对象)。
2. 如何确保在JavaScript中正确使用this关键字?
为了确保正确使用this关键字,需要了解它在不同上下文中的指向。可以使用一些规则和技巧来确定this的行为。例如,可以使用call、apply或bind方法显式地绑定this的值,或者在函数内部使用箭头函数来继承外部作用域的this值。此外,了解JavaScript中函数执行上下文的规则也很重要,以便正确理解this关键字的指向。
3. JavaScript中的this与this page有何区别?
JavaScript中的this与this page并不是同一个概念。this page通常指的是当前正在浏览的网页或页面。而JavaScript中的this关键字是用于指代当前执行上下文中的对象。它的指向是动态的,取决于调用函数的方式和位置。因此,this与this page是不同的概念,不能简单地将它们等同起来。