侧边栏壁纸
博主头像
Fonda's Lab 博主等级

关山难越,谁悲失路之人?萍水相逢,尽是他乡之客。

  • 累计撰写 49 篇文章
  • 累计创建 27 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

JavaScript中的this

LouisFonda
2024-05-30 / 0 评论 / 0 点赞 / 8 阅读 / 0 字 / 正在检测是否收录...

JavaScript的this

在 JavaScript 中,this 是一个非常重要的关键字,它的值取决于函数调用的上下文。this 的值不是在函数定义时决定的,而是在函数调用时决定的。不同的调用方式会导致 this 的值不同。

1. 全局上下文

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

console.log(this); // 浏览器中,输出: Window

2. 对象方法

当函数作为对象的方法调用时,this 指向该对象。

const obj = {
  name: 'Alice',
  greet: function() {
    console.log(this.name);
  }
};

obj.greet(); // 输出: Alice

3. 构造函数

当使用 new 操作符调用构造函数时,this 指向新创建的对象。

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

const person1 = new Person('Bob');
console.log(person1.name); // 输出: Bob

4. 箭头函数

箭头函数不会创建自己的 this,它会捕获外部上下文的 this 值。

const obj = {
  name: 'Charlie',
  greet: function() {
    const innerFunction = () => {
      console.log(this.name);
    };
    innerFunction();
  }
};

obj.greet(); // 输出: Charlie

5. 显式绑定

可以使用 call、apply 和 bind 方法显式地绑定 this。

call 和 apply 方法可以显式地设置 this 的值,并立即调用函数。它们之间的区别在于传参方式不同:call 接受参数列表,apply 接受参数数组。

function greet() {
  console.log(this.name);
}

const obj = { name: 'Dave' };

greet.call(obj); // 输出: Dave
greet.apply(obj); // 输出: Dave

bind 方法创建一个新函数,并永久绑定 this 到指定的对象。

function greet() {
  console.log(this.name);
}

const obj = { name: 'Eve' };

const boundGreet = greet.bind(obj);
boundGreet(); // 输出: Eve

6. DOM 事件处理器

在事件处理器中,this 指向触发事件的 DOM 元素。

<button id="myButton">Click me</button>
<script>
  document.getElementById('myButton').addEventListener('click', function() {
    console.log(this); // 输出: <button id="myButton">Click me</button>
  });
</script>

7. 严格模式

在严格模式下,全局上下文中的 this 是 undefined,而不是全局对象。

'use strict';

function test() {
  console.log(this);
}

test(); // 输出: undefined

总结

全局上下文:this 指向全局对象。
对象方法:this 指向调用方法的对象。
构造函数:this 指向新创建的对象。
箭头函数:this 由外层上下文决定。
显式绑定:使用 call、apply、bind 可以显式地设置 this。
DOM 事件处理器:this 指向触发事件的 DOM 元素。
严格模式:全局上下文中的 this 是 undefined。
理解 this 的关键是看函数的调用方式,而不是函数的定义位置。

0

评论区