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

Javascript 编程基础(4)函数 | 4.2、this 绑定机制

文章目录

  • 一、this 绑定机制
    • 1、原理分析
      • 1.1、动态绑定特性
      • 1.2、绑定规则优先级
      • 1.3、执行上下文
    • 2、绑定类型详解
      • 2.1、默认绑定(独立函数调用)
      • 2.2、 隐式绑定(方法调用)
      • 2.3、显式绑定(call/apply/bind)
      • 2.4、new 绑定(构造函数)
      • 2.5、箭头函数(词法绑定)

一、this 绑定机制

1、原理分析

this 是 JavaScript 中最容易混淆的概念之一,它的绑定机制决定了函数执行时的上下文。理解 this 的工作原理对于编写可靠的 JavaScript 代码至关重要。

1.1、动态绑定特性

this 的值不是在函数定义时确定的,而是在函数被调用时动态绑定的。这与大多数编程语言中的 thisself 概念有显著区别。

1.2、绑定规则优先级

JavaScript 按照以下优先级顺序确定 this 的绑定:

  1. new 绑定(构造函数调用)
  2. 显式绑定(call/apply/bind)
  3. 隐式绑定(方法调用)
  4. 默认绑定(普通函数调用)

1.3、执行上下文

this 实际上是执行上下文的一个属性,每次函数调用都会创建一个新的执行上下文,其中的 this 值由调用方式决定。

2、绑定类型详解

2.1、默认绑定(独立函数调用)

  • 非严格模式下指向全局对象(浏览器中为 window,Node.js 中为 global
  • 严格模式下为 undefined
function foo() {console.log(this); 
}foo(); // 浏览器中输出 window(非严格模式)

2.2、 隐式绑定(方法调用)

  • 函数作为对象方法调用时,this 指向调用该方法的对象
  • 存在隐式丢失问题
const obj = {name: 'Alice',greet: function() {console.log(`Hello, ${this.name}`);}
};obj.greet(); // "Hello, Alice"(this 指向 obj)// 隐式丢失示例
const greetFn = obj.greet;
greetFn(); // "Hello, undefined"(this 指向全局)

2.3、显式绑定(call/apply/bind)

  • 直接指定 this 的值
  • bind 创建永久绑定,call/apply 立即执行
function introduce(lang) {console.log(`${this.name} codes in ${lang}`);
}const dev = { name: 'Bob' };// call(参数逐个传递)
introduce.call(dev, 'JavaScript'); // apply(参数为数组)
introduce.apply(dev, ['Python']); // bind(创建新函数)
const boundFn = introduce.bind(dev, 'Java');
boundFn();

2.4、new 绑定(构造函数)

  • this 指向新创建的对象实例
  • 自动执行以下步骤:
    1. 创建新对象
    2. this 绑定到新对象
    3. 执行构造函数代码
    4. 返回新对象(除非显式返回其他对象)
function Person(name) {this.name = name;
}const p = new Person('Charlie');
console.log(p.name); // "Charlie"

2.5、箭头函数(词法绑定)

  • 继承定义时的外层 this
  • 无法通过 call/apply/bind 修改
  • 没有自己的 thisargumentssupernew.target
const outer = {name: 'Dave',inner: () => {console.log(this.name); // 继承定义时的 this},properInner: function() {setTimeout(() => {console.log(this.name); // 继承 properInner 的 this}, 100);}
};

相关文章:

  • 全球证券交易系统开发方案
  • Pytorch基础操作
  • C#中Task.Run的线程管理最佳实践与并发控制
  • 【Linux系统】第七节—git+cgdb(详解)
  • 更新ubuntu软件源遇到GPG error
  • MySQL中的重要常见知识点(入门到入土!)
  • Python高效网络爬虫开发指南
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(26):のは ・ のが ・ のを
  • 东莞一锂离子电池公司IPO终止,客户与供应商重叠,社保缴纳情况引疑
  • 力扣周赛置换环的应用,最少交换次数
  • Python爬虫实战:获取小说网最新风云榜数据并分析,为创作者提供参考素材
  • python-leetcode 71.每日温度
  • 【技术揭秘】Profinet转RS485如何优化冲剪机的实时通信性能?​​
  • App 出海:全渠道营销如何通过性能监控与精准归因实现增长
  • 【C++ Primer 学习札记】函数传参问题
  • Xilinx XCAU10P-2FFVB676I 赛灵思 Artix UltraScale+ FPGA
  • Xilinx 7Series\UltraScale FPGA MultiBoot Fallback
  • 力扣-三数之和
  • 浙大团队研发Earth Explorer系统,探索深时演化/地学剖面/科研场景,赋能深时地球科学研究
  • 可理解性输入:逛超市
  • 唐山建网站公司/百度推广费用
  • 温州网站建设 首选国鼎网络好/班级优化大师简介
  • 电子商务网站建设书籍/百度公司总部地址
  • 网站排名软件优化/正规seo一般多少钱