0
点赞
收藏
分享

微信扫一扫

第16课 核心函数(方法)

hoohack 2024-11-06 阅读 21

在 JavaScript 中,this 是一个非常灵活且强大的关键字。它的值会根据函数的调用方式而变化,不像其他编程语言中总是指向当前对象。具体来说,this 的指向在 JavaScript 中与调用位置(而非定义位置)有关,因此它在不同场景下会有不同的值。

以下是对 JavaScript 中 this 的几种典型使用场景的详细理解:

在浏览器的全局作用域中,this 指向 window 对象,而在 Node.js 中则指向 global 对象。

console.log(this === window);  // 在浏览器中输出 true

如果在严格模式下("use strict"),全局作用域中的 this 会是 undefined

"use strict";
console.log(this);  // 输出 undefined

this 在对象的方法中被调用时,它指向调用该方法的对象。

const person = {
  name: 'Alice',
  sayName() {
    console.log(this.name);
  }
};

person.sayName();  // 输出: "Alice"

在这个例子中,this 指向 person 对象,因此 this.nameAlice

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

function Person(name) {
  this.name = name;
}

const alice = new Person('Alice');
console.log(alice.name);  // 输出: "Alice"

在这种情况下,this 指向构造函数生成的对象实例,即 alice

箭头函数中的 this 和普通函数不同,它并不绑定到调用它的对象。相反,箭头函数的 this 会“继承”自外层的词法作用域,也就是它定义时所处的环境的 this

const person = {
  name: 'Alice',
  sayName: function() {
    const inner = () => {
      console.log(this.name);
    };
    inner();
  }
};

person.sayName();  // 输出: "Alice"

在这个例子中,inner 是一个箭头函数,所以它的 this 继承自 sayNamethis,而 sayNamethisperson

可以使用 callapplybind 方法显式地绑定 this

  • call:立即调用函数,并传入 this 值和其他参数。
  • apply:与 call 类似,但接受的是参数数组。
  • bind:不会立即调用函数,而是返回一个新的绑定了指定 this 值的函数。
function greet(greeting) {
  console.log(greeting + ", " + this.name);
}

const person = { name: 'Alice' };

greet.call(person, 'Hello');     // 输出: "Hello, Alice"
greet.apply(person, ['Hi']);     // 输出: "Hi, Alice"

const greetAlice = greet.bind(person);
greetAlice('Hey');               // 输出: "Hey, Alice"

在 DOM 事件处理函数中,this 默认指向触发事件的 DOM 元素。

const button = document.querySelector('button');
button.onclick = function() {
  console.log(this);  // 输出: <button> 元素
};

在这个例子中,this 会指向 button,因为它是触发 onclick 事件的 DOM 元素。

在非严格模式下,setTimeoutsetInterval 中的普通函数的 this 默认指向全局对象 window。但是如果使用箭头函数,则 this 会保留外层的作用域绑定。

const person = {
  name: 'Alice',
  greet() {
    setTimeout(function() {
      console.log(this.name);  // 在非严格模式下输出: undefined
    }, 1000);
  }
};

person.greet();

const personArrow = {
  name: 'Alice',
  greet() {
    setTimeout(() => {
      console.log(this.name);  // 输出: "Alice"
    }, 1000);
  }
};

personArrow.greet();
  • 全局作用域this 指向 windowglobal 对象(严格模式下为 undefined)。
  • 对象方法this 指向调用方法的对象。
  • 构造函数this 指向新创建的对象实例。
  • 箭头函数this 指向定义时的词法作用域,而不是调用对象。
  • 显式绑定:使用 callapplybind 可以显式地指定 this
  • 事件处理函数this 指向触发事件的 DOM 元素。
举报

相关推荐

0 条评论