JS的this关键字详解

this 关键字在 JavaScript 中是一个特殊的标识符,它是函数执行时的一个隐式参数,代表函数执行时的上下文(也就是说,this 指向的是那个对象,该函数是作为那个对象的方法调用的)。

this 的值在函数被调用时确定,不是在函数被定义时确定,这是 JavaScript 中的一个常见陷阱。

  1. 在普通函数中使用 this

在普通函数中,this 指向全局对象,在浏览器中通常是 window 对象。




function foo() {
    console.log(this); // 输出 window 对象
}
foo();
  1. 在对象方法中使用 this

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




let obj = {
    name: 'John',
    greet: function() {
        console.log('Hello, ' + this.name); // 输出 Hello, John
    }
};
obj.greet();
  1. 在构造函数中使用 this

在构造函数中,this 指向新创建的对象实例。




function Person(name) {
    this.name = name;
}
let person = new Person('John');
console.log(person.name); // 输出 John
  1. 在箭头函数中使用 this

在箭头函数中,this 是静态的,它会捕获其自身作用域可访问的 this 值。




let obj = {
    name: 'John',
    greet: function() {
        let arrowFunction = () => {
            console.log('Hello, ' + this.name); // 输出 Hello, John
        };
        arrowFunction();
    }
};
obj.greet();
  1. 在事件监听函数中使用 this

在事件监听函数中,this 通常指向监听事件的 DOM 元素。




<button id="myButton">Click me</button>



document.getElementById('myButton').addEventListener('click', function() {
    console.log(this); // 输出按钮 DOM 元素
});
  1. 在回调函数中使用 this

在回调函数中,this 的值取决于回调函数被调用的方式。




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

为了在回调函数中保持 this 的值,通常有以下几种方法:

  • 使用箭头函数捕获 this
  • 在调用回调之前将 this 赋值给一个变量,并在回调中使用这个变量。
  • 使用 Function.prototype.bind 来绑定 this 的值。



let obj = {
    name: 'John',
    greet: function() {
        setTimeout(() => {
            console.log('Hello, ' + this.name); // 输出 Hello, John
        }, 100);
    }
};
obj.greet();
  1. callapplybind 方法中使用 this

Function.prototype.callFunction.prototype.applyFunction.prototype.bind 方法可用于更改函数的 this 值并调用函数。




let obj = {
    name: 'John',
   
最后修改于:2024年08月11日 17:56

评论已关闭

推荐阅读

DDPG 模型解析,附Pytorch完整代码
2024年11月24日
DQN 模型解析,附Pytorch完整代码
2024年11月24日
AIGC实战——Transformer模型
2024年12月01日
Socket TCP 和 UDP 编程基础(Python)
2024年11月30日
python , tcp , udp
如何使用 ChatGPT 进行学术润色?你需要这些指令
2024年12月01日
AI
最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
2024年11月24日
ChatGPT 和 DALL·E 2 配合生成故事绘本
2024年12月01日
omegaconf,一个超强的 Python 库!
2024年11月24日
【视觉AIGC识别】误差特征、人脸伪造检测、其他类型假图检测
2024年12月01日
[超级详细]如何在深度学习训练模型过程中使用 GPU 加速
2024年11月29日
Python 物理引擎pymunk最完整教程
2024年11月27日
MediaPipe 人体姿态与手指关键点检测教程
2024年11月27日
深入了解 Taipy:Python 打造 Web 应用的全面教程
2024年11月26日
基于Transformer的时间序列预测模型
2024年11月25日
Python在金融大数据分析中的AI应用(股价分析、量化交易)实战
2024年11月25日
AIGC Gradio系列学习教程之Components
2024年12月01日
Python3 `asyncio` — 异步 I/O,事件循环和并发工具
2024年11月30日
llama-factory SFT系列教程:大模型在自定义数据集 LoRA 训练与部署
2024年12月01日
Python 多线程和多进程用法
2024年11月24日
Python socket详解,全网最全教程
2024年11月27日