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

JavaScript中函数调用的四种模式及其this绑定优先级表

JavaScript函数调用有四种模式:1.方法调用时this指向调用对象;2.函数调用时非严格模式this为全局对象,严格模式为undefined;3.构造调用时this指向新实例;4.显式调用时通过call/apply/bind指定this。JavaScript中函数调用的四种模式JavaScript中函数的this值不是由函数定义决定的,而是由**调用方式**决定的。共存在四种标准调用模式,每种对应不同的this绑定规则:1. 方法调用模式(Method Invocation)当函数作为对象的属性被调用时,this指向该对象。const obj = { name: 'Alice', greet() { console.log(this.name); // 'Alice' }};obj.greet(); // this → obj2. 函数调用模式(Function Invocation)独立调用函数(非对象属性、非new、非call/apply/bind),在非严格模式下this指向全局对象(浏览器中为window),严格模式下为undefined。function foo() { console.log(this);}foo(); // 非严格:window;严格:undefined3. 构造器调用模式(Constructor Invocation)使用new关键字调用函数时,会创建新对象,this绑定到该新实例。function Person(name) { this.name = name;}const p = new Person('Bob'); // this → 新建的p实例4. 显式调用模式(Explicit Invocation)通过.call()、.apply()或.bind()手动指定this值。function log() { console.log(this.role);}const user = { role: 'admin' };log.call(user); // 'admin'log.apply(user); // 'admin'log.bind(user)(); // 'admin'this绑定优先级顺序当多种绑定方式共存时,this取值遵循明确的优先级,从高到低如下:new 绑定:使用new调用时,无论是否用bind预设过this,最终this都指向新创建的实例(bind返回的函数被new调用时,原绑定被忽略) 显式绑定:包括call、apply、bind。其中call/apply在运行时立即生效,bind生成永久绑定函数(但可被new覆盖) 隐式绑定(方法调用):对象.方法() 形式,this指向调用者对象。若存在多层嵌套(如obj.fn()),只看最直接的调用对象 默认绑定(函数调用):以上都不满足时触发。严格模式为undefined,非严格模式为全局对象注意:箭头函数不遵循上述任何规则——它没有自己的this,始终继承外层普通函数作用域的this值(词法绑定),因此不参与该优先级表。常见陷阱与验证技巧理解优先级的关键在于“谁最终执行了函数”以及“以什么方式执行”。可借助以下方式快速判断: Zeemo AI 一款专业的视频字幕制作和视频处理工具

http://www.jsqmd.com/news/679603/

相关文章:

  • 别再轮询了!STM32CubeIDE实战:用DMA+ADC中断模式高效采集多路传感器数据(附避坑指南)
  • Docker 27调度器深度解耦:从CPU亲和到拓扑感知,5步实现资源利用率提升42.6%
  • 别再问Markdown怎么合并单元格了,用HTML的rowspan和colspan属性5分钟搞定
  • 浏览器端图像分类实战:TensorFlow.js与WebAssembly应用
  • 2026年Q2北京带司机包车:北京租车公司哪家好、北京租车公司排名前十名、北京租车多少钱、北京考斯特出租、北京考斯特包车选择指南 - 优质品牌商家
  • 避开这些坑!S7-1200通过RS485读写RFID标签数据时的5个常见故障与解决方案
  • Bootloader如何选对设备树?深入浅出解析高通BOARD-ID/MSM-ID匹配机制
  • 从《流浪地球2》到实战:聊聊多无人机‘蜂群’任务分配的那些坑与最佳实践
  • 从SRTM3数据读取到实战:用Java GDAL+Eclipse构建你的第一个地理分析小工具
  • DeepLabv1:空洞卷积+全连接CRF屠榜PASCAL VOC
  • 2026Q2三相电容器品牌盘点:低压电容器/功率因数控制器/单相电力电容器/单相电容器/无功补偿器/无功补偿柜/选择指南 - 优质品牌商家
  • 好写作AI:文献综述的“隐形情报官”,专治“读了100篇文献还是没观点”
  • 从图像拼接实战出发:手把手教你用OpenCV暴力匹配+Python搞定多图自动对齐
  • VSCode集成AI编程助手提升开发效率指南
  • Docker 27国产化适配不是选配,是必选项!2024Q3起所有政务云项目强制要求提交《适配证明函》——附3份可直接盖章的模板
  • Vue3项目里别再写回调地狱了!手把手教你用Promise优雅处理异步(附then-fs实战)
  • 如何快速实现Android PDF打印:面向开发者的完整指南
  • MIT 6.858实验避坑指南:手把手教你搞定Buffer Overflow漏洞利用(附完整Shellcode)
  • 告别WINCC自带报表!用Excel VBA做个灵活的电能日报表(附完整源码)
  • 浙江大学毕业论文LaTeX模板:学术写作的终极效率工具
  • 别再纠结位置式还是增量式了!深入对比FPGA中两种PI实现的硬件成本与性能差异
  • 旧电视焕新记:手把手教你用mstar-bin-tool解包康佳LED37R5200PDF固件,实现精简与root
  • 为什么你的MATLAB FIR滤波器总‘丢’数据?深入解析filter函数与线性相位时延的‘爱恨情仇’
  • 告别Flask和Django!用FastAPI + Pydantic 5分钟搞定一个带自动文档的Python API
  • 嵌入式Linux驱动开发避坑:为什么你的platform_driver_register总是不进probe函数?
  • 告别词库迁移烦恼:深蓝词库转换让你轻松在30+输入法间自由切换
  • SPI协议家族简史:从摩托罗拉到Quad SPI,速度是如何一步步翻倍的?
  • RAG应用必看!大文档如何分块?提升检索质量秘籍大公开!
  • 个人开发者福音:5分钟搞定微信测试号申请与Token验证(附Java避坑代码)
  • Etsy机器学习工程师如何优化非标商品推荐系统