JavaScript中的this关键字详解与实践

107 阅读2分钟

一、this的出现背景

在面向对象的编程中,this关键字扮演着重要的角色,充当了函数与对象之间的桥梁,使得函数能够直接访问所在对象的属性和方法,提高了代码的清晰度和执行效率。

二、this的常见使用场景

this可以在全局作用域、普通函数体以及构造函数等多种环境中使用,但其指向取决于函数的调用方式。

三、this的指向规则

  1. 默认绑定:当函数被单独调用时,this默认指向全局对象。在浏览器环境中为window,在Node.js环境中为global
function logThis() {
    console.log(this);
}
logThis(); // 输出:Window {...} 或 global {...}

image.png image.png

  1. 隐式绑定:当函数作为对象的方法被调用时,this指向该对象。
const obj = {
    name: '牢大',
    greet: function() {
        console.log(`Hello, my name is ${this.name}`);
    }
};
obj.greet(); // 输出:Hello, my name is 牢大
  1. 隐式丢失:函数脱离对象上下文调用时,this会指向全局对象,可通过显示绑定或箭头函数避免。
const obj = {
    name: 'Bob',
    greet: function() {
        console.log(`Hello, my name is ${this.name}`);
    }
};
const greet = obj.greet;
greet(); // 输出:Hello, my name is undefined (在严格模式下)
  1. 显示绑定:通过call、apply和bind方法明确指定函数调用时的this值。
const obj = {
    name: '盯帧'
};
const greet = function(greeting) {
    console.log(`${greeting}, my name is ${this.name}`);
};
greet.call(obj, 'Hello'); // 输出:Hello, my name is 盯帧
  1. new绑定:使用new关键字创建对象时,构造函数中的this指向新创建的对象实例。
function Person(name) {
    this.name = name;
}
const person = new Person('David');
console.log(person.name); // 输出:David

四、箭头函数与this

箭头函数没有自己的this绑定,greet 函数内部的 this 并不是指向 obj 对象,而是指向全局对象(在浏览器环境中是 window,在Node.js环境中是 global)。因此,this.name 会尝试访问全局对象的 name 属性,而不是 objname 属性。

const obj = {
2    name: 'Eve',
3    greet: () => {
4        console.log(`Hello, my name is ${this.name}`);
5    }
6};
7obj.greet(); // 输出:Hello, my name is undefined (或全局对象的name属性)

image.png

因为在全局是没有定义name这个属性,自然就会是undefinded。

五、总结与建议

理解this的指向规则对于编写高效、可读性强的JavaScript代码至关重要。ES6的箭头函数提供了简洁的方式来处理this绑定问题,但仍需保持对this指向的清晰认识。

以上是关于JavaScript中this关键字的详细解析与实践,希望对您有所帮助。期待你的点👍!