当前位置: 首页 > news >正文

JavaScript中this的5大核心规则详解

在 JavaScript 中,this 是一个特殊关键字,其值取决于函数的 调用方式 而非定义位置。它的行为遵循一套明确的规则,以下是核心规则和示例:


1. 默认绑定(独立函数调用)

当函数独立调用时(不作为方法、构造函数等),this 指向全局对象:

  • 浏览器中window
  • Node.js 中global
function show() {console.log(this); // 浏览器:Window / Node.js:global
}
show(); // 独立调用

严格模式('use strict')下thisundefined


2. 隐式绑定(方法调用)

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

const user = {name: "Alice",greet() {console.log(`Hello, ${this.name}!`);}
};
user.greet(); // "Hello, Alice!"(this = user)

⚠️ 易错点:绑定丢失
若将方法赋值给变量后调用,会丢失原始绑定,退回到默认绑定:

const greet = user.greet;
greet(); // "Hello, undefined!"(this 指向全局)

3. 显式绑定(call / apply / bind)

通过 call()apply()bind() 强制指定 this

function greet() {console.log(`Hello, ${this.name}!`);
}const alice = { name: "Alice" };
const bob = { name: "Bob" };// call/apply 立即调用
greet.call(alice); // "Hello, Alice!"(this = alice)
greet.apply(bob);  // "Hello, Bob!"(this = bob)// bind 创建新函数(永久绑定)
const boundGreet = greet.bind(alice);
boundGreet(); // "Hello, Alice!"

4. new 绑定(构造函数)

使用 new 调用构造函数时,this 指向 新创建的对象

function Person(name) {this.name = name; // this = 新对象
}
const alice = new Person("Alice");
console.log(alice.name); // "Alice"

5. 箭头函数:词法作用域绑定

箭头函数 没有自己的 this,它会继承外层作用域的 this(定义时绑定,非调用时):

const user = {name: "Alice",greet: function() {// 普通函数:this = usersetTimeout(() => {console.log(`Hello, ${this.name}!`); // this 继承自 greet}, 100);}
};
user.greet(); // "Hello, Alice!"(箭头函数捕获了 user)

⚠️ 注意

  • 箭头函数的 this 不可通过 call/bind 修改。
  • 对象字面量、类中的箭头函数会绑定到外层作用域(可能是全局)。

特殊场景总结

场景this 指向示例
独立函数调用全局对象(严格模式为 undefinedfunc()
对象方法调用调用该方法的对象obj.method()
call/apply/bind显式指定的对象func.call(ctx)
new 构造函数新创建的对象实例new Constructor()
箭头函数外层词法作用域的 this() => { ... }
DOM 事件处理触发事件的元素button.onclick = func

常见问题解决技巧

  1. 方法绑定丢失:用 bind() 或箭头函数固定 this

    // 方法1: bind
    const boundMethod = obj.method.bind(obj);
    // 方法2: 箭头函数
    obj.method = () => { ... };
    
  2. 回调函数中的 this

    • 使用箭头函数保留外层 this
    • 显式绑定:setTimeout(function() {...}.bind(this), 100)
  3. 类中的方法:使用箭头函数或手动绑定,避免丢失 this

    class Counter {count = 0;// 方案1: 类字段(箭头函数)increment = () => {this.count++;};// 方案2: 构造函数中绑定constructor() {this.decrement = this.decrement.bind(this);}decrement() {this.count--;}
    }
    

终极秘诀

this 的值在函数调用时确定,而非定义时。
始终问自己:这个函数是如何被调用的?

  • obj.func()this = obj
  • func()this = 全局/undefined
  • new Func()this = 新对象
  • 箭头函数 → 继承外层 this
http://www.dtcms.com/a/296889.html

相关文章:

  • vue 项目中 components 和 views 包下的组件功能区别对比,示例演示
  • Eureka-服务注册,服务发现
  • CSDN技术专栏开篇:高效开发环境搭建指南
  • Android Activity与Fragment生命周期变化
  • 深度学习(鱼书)day01--感知机
  • springboot实战篇2
  • 磁悬浮转子不平衡质量控制:比例谐振控制器深度解析
  • iOS网络之异步加载
  • Win10系统自带输入法打字,莫名切全角英文字母变大问题
  • Linux驱动18 --- LCD 屏
  • Ubuntu同一网段下配置多个雷达
  • 大模型开发框架LangChain之集成MCP工具
  • MC0461排队
  • 【时时三省】(C语言基础)怎样定义和使用指向函数的指针变量
  • 深入解析Java微服务架构请求流程:Nginx到Nacos的完整旅程
  • 数据库期中复习
  • JSONObject相关知识点
  • 嵌入式通信知识串讲:从同步 / 异步传输到 UART 协议 STM32F103 硬件解析
  • 大模型提示词漏洞攻防测试:技术分析与实践指南
  • 客户关系管理(CRM)百科:定义、价值及发展趋势
  • JMeter 性能测试实战笔记
  • Javascript NaN Symbol BigInt
  • 论文阅读:《无约束多目标优化的遗传算法,群体和进化计算》
  • 【25-cv-3322、25-cv-3323】Aeropostale连发两案!12个商标冻住600多家店铺
  • Android集成Google Map
  • 基于自适应控制算法的SVC与STATCOM联合优化
  • 如何在IEEE上检索文献|综述性文献
  • springboot 一键下载文件
  • Linux操作系统原理与应用
  • 河南萌新联赛2025第(二)场:河南农业大学