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

javascript中的caller和Error.stack

Function.prototype.caller 是一个非标准、已废弃但浏览器仍兼容的属性,用于获取调用当前函数的那个函数引用
 

一、基本语法

func.caller
 
  • 类型:函数引用 / null
  • 只读:是(访问器属性)
  • 生效时机仅在函数执行期间有效,执行完毕后为 null

二、核心规则

  1. 普通调用(非严格模式)
    • 若函数由全局 / 顶层代码调用:caller === null
    • 若由另一个函数调用:caller 指向该调用函数
 
function A() { console.log(A.caller); }
function B() { A(); }B(); // 输出:ƒ B() { A(); }
A(); // 输出:null(全局调用)

image

严格模式('use strict')

  • 访问 caller 直接抛 TypeError,彻底禁用
 
'use strict';
function A() { console.log(A.caller); }
function B() { A(); }B(); // Uncaught TypeError: 'caller' is restricted

image

调用者是严格函数

  • 即使当前函数非严格,只要调用者是严格函数caller 也为 null
 
function A() { console.log(A.caller); }
function B() { 'use strict'; A(); }B(); // 输出:null

 

三、与 arguments.callee 的区别

  • func.caller:获取调用当前函数的函数(上层)
  • arguments.callee:获取当前函数本身(自身),ES5 严格模式已移除
 

四、安全与替代方案

  • 为什么不推荐用 caller
     
    • 非标准:ES 规范仅定义 “毒丸访问器”(抛错),引擎实现不一致
    • 安全风险:可能泄露调用栈,被恶意代码利用
    • 调试困难:严格模式 / 异步场景下行为不可靠
     
  • 现代替代:Error.stack(推荐)

 

function A() {console.log(new Error().stack); // 直接拿到完整调用栈
}
function B() { A(); }
B();

image

 从输出结果来看,Error.stack的调用关系是从下向上依次调用。

五、总结

  • caller历史遗留属性,用于获取调用者函数
  • 严格模式禁用,非严格模式下仅执行期间有效
  • 现代开发应优先用 Error.stack 或调试工具,避免依赖 caller

 

 

 

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

相关文章:

  • 工厂货物智能入库全流程自动化:基于实在Agent与ISSUT技术的2026工业自动化实战指南
  • Fluent Launch界面深度解析:从串行到并行的性能跃迁之路
  • 别再手动编译了!用Buildroot 2024.02为树莓派4B一键构建定制Linux系统(附完整配置流程)
  • Windows任务栏透明美化终极指南:TranslucentTB快速配置完整教程
  • 设计程序核算职场各类福利发放数据,对比福利成本与员工积极性变化,测算最优福利发放标准,控制企业人力开发同时提升员工幸福感。
  • MCDF顶层验证环境复用策略与实现
  • 雀魂Mod Plus终极指南:免费解锁全角色皮肤的最简单方法
  • CMake-GUI可视化编译OpenCV 3:给命令行恐惧症患者的Ubuntu图形化安装指南
  • YOLOv11 改进 - 注意力机制 Focused Linear Attention 聚焦线性注意力:增强特征聚焦与多样性,优化多尺度目标检测
  • 用Python和OpenCV搞定车道曲率计算:从像素到真实世界的保姆级转换指南
  • 从渔船到货轮:一文看懂AIS B类与A类设备的区别及数据解析要点
  • 【Mac效率】告别窗口切换烦恼:用AfloatX解锁AlwaysOnTop、置底与透明度的窗口管理新姿势
  • 如何用HsMod插件让炉石传说游戏体验提升300%:终极完整指南
  • Navicat和DBeaver连接Oracle 19c保姆级教程:从配置文件修改到用户授权,一次搞定
  • Zotero插件市场:让插件管理变得前所未有的简单
  • 终极指南:如何免费批量下载网易云音乐FLAC无损音质歌曲
  • OOXML 文档格式剖析:哈希、ZIP结构与识别
  • 探索FanControl:Windows平台专业风扇控制软件完全指南
  • 打工人高效工具!OpenClaw 汉化版部署全程教学
  • 从LC谐振到SAW滤波器:浅谈手机里的射频前端是怎么‘过滤’信号的
  • TensorPool:AI-Native RAN的3D异构计算引擎设计与优化
  • 【2024最新】Midjourney Encaustic风格Prompt公式库(含17组已验证英文提示模板+中文翻译对照表)
  • 避开这些坑,你的Z7板子DDR才能稳如老狗:PCB Layout信号完整性实战解析
  • 怪物猎人世界终极叠加层工具:HunterPie 5分钟快速上手指南
  • MySQL安装报错libssl.so.10找不到?一份给Linux新手的依赖问题排查与解决指南
  • GENIVI DLT Viewer不只是看日志:手把手教你定制插件,打造专属车载诊断工具链
  • 对于软硬件结合的技术而言,有些经验永远无法通过单纯的仿真获得
  • FreeRTOS移植避坑指南:RISC-V平台下源码目录的‘瘦身’与配置要点解析
  • Wi-Fi 6(802.11ax)开发笔记:深入HE变体与BSR Control字段,实现高效上行调度
  • 告别环境配置噩梦:我是如何通过一份.pro文件和DLL清单搞定QT+Qgis二次开发环境的