JavaScript 保留关键字
JavaScript Hoisting 

JavaScript this关键字

在 JavaScript 中,this 是一个特殊的关键字,它指向当前执行代码的对象。this 的值在运行时是动态确定的,取决于函数调用的方式。

this 的指向规则


全局上下文中的 this:

在全局执行环境中,this 指向全局对象(在浏览器中通常是 window 对象)。

console.log(this === window); // true
function globalFunction() {
  console.log(this === window); // true
}
globalFunction();



函数中的 this:

在函数内部,this 的值取决于函数的调用方式。

如果函数作为对象的方法被调用,this 指向调用该方法的对象。

let obj = {
  name: 'John',
  greet: function() {
    console.log('Hello, ' + this.name);
  }
};
obj.greet(); // 输出: Hello, John


构造函数中的 this:

当函数作为构造函数使用时(通过 new 关键字调用),this 指向新创建的实例对象。

function Person(name) {
  this.name = name;
  this.greet = function() {
    console.log('Hello, ' + this.name);
  };
}
let person1 = new Person('Alice');
person1.greet(); // 输出: Hello, Alice


使用 call、apply、bind 显式指定 this:

call 和 apply 方法可以显式地指定函数内部的 this 值,而 bind 方法则会创建一个新的函数,this 值永久地绑定到指定的对象上。

let obj1 = { name: 'Emily' };
function greet() {
  console.log('Hello, ' + this.name);
}
greet.call(obj1); // 使用 call 方法指定 this,输出: Hello, Emily


箭头函数中的 this:

箭头函数没有自己的 this 绑定,它继承自外层第一个非箭头函数作用域的 this 值。

let obj = {
  name: 'Mike',
  greet: function() {
    let innerFunc = () => {
      console.log('Hello, ' + this.name);
    };
    innerFunc();
  }
};
obj.greet(); // 输出: Hello, Mike


特殊情况和注意事项

严格模式下的 this:在严格模式下,全局作用域中的 this 是 undefined,而不是默认指向全局对象。

事件处理程序中的 this:在事件处理程序中,this 通常指向触发事件的元素。

回调函数中的 this:回调函数的 this 取决于它们是如何被调用的,通常需要通过 .bind() 方法或箭头函数来确保 this 的正确绑定。

理解 JavaScript 中 this 的指向是编写复杂应用程序和面向对象代码的关键,它可以帮助避免许多常见的错误和理解代码的运行行为。