调试揭示模块模式:函数在调用之前不在范围内?

2023-11-22

如果我在 Chrome 开发者工具中运行此代码:

var test = (function () {

  var publicFunction,
      privateFunction1,
      privateFunction2;

  privateFunction1 = function privateFunction1() {
    return true;
  };

  privateFunction2 = function privateFunction2() {
    return true;
  };

  publicFunction = function publicFunction() {
    privateFunction1();
    debugger;
  };

  return {
    publicFunction: publicFunction
  };
})();

why is privateFunction1在断点的范围内,同时privateFunction2 is not?

Screenshot of Chrome Dev Tools


有趣的问题。

privateFunction2 is在范围内publicFunction, but publicFunction从未实际使用过它。我相信您在调试器中看到的内容是因为 V8(Chrome 的 JavaScript 引擎)出于各种原因(包括最小化内存使用)优化了闭包的内容。

理论上,根据规范,publicFunction关闭(具有持久引用)其定义范围内的所有符号。具体来说,一个执行上下文是为调用最外面的匿名函数而创建的,并且该执行上下文有一个词汇环境与相关的绑定对象到哪个publicFunction有一个隐式的、匿名的引用。该绑定对象具有(理论上)名称的属性publicFunction, privateFunction1, privateFunction2,以及其他一些事情(arguments等等)。

但问题是publicFunction实际上没有引用任何东西,但是privateFunction1,并且有了适当的代码,它cannot参考其他任何东西。为了让它引用其他任何东西,你必须更改它的代码,当然 V8 会做出不同的决定。代码在publicFunction has no eval(string) or new Function(string)调用,因此 V8 可以自由地对其引用的符号进行静态分析。这意味着,如果没有调试器,绑定对象就没有必要保留这些其他属性。它们从未被使用过。

由于 V8 是一个积极优化的编译器(是的,编译器),显然它从执行上下文的绑定对象中删除了死属性。

如果我添加一些东西publicFunction使用privateFunction2对于任何事情,我都可以像我一样从控制台引用它privateFunction1.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调试揭示模块模式:函数在调用之前不在范围内? 的相关文章

  • 如何获取对象的所有属性?

    如何在 JavaScript 中使用反射获取对象的所有属性 循环遍历对象并获取属于该对象且不属于该对象的每个键 一个函数 var properties for var key in obj if obj hasOwnProperty key
  • 跨域XMLHttp请求

    这是我的情况 我有一台 Web 服务器机器 一台客户端机器和第三台运行一些侦听 XMLHttpRequest 的程序的机器 客户端从客户端计算机访问网络服务器 进行一些更改 然后单击 保存 此时 数据被发送回网络服务器和第三台机器 所有这些
  • javascript 中对象的“异步”循环

    通常 我们可以对数组和对象进行循环来迭代属性 值 但循环是阻塞的 但是 超时可用于模拟异步循环 我设法为数组做到了这一点 http jsfiddle net LHhy2 do stuff function asyncLoop i do st
  • pubnub 和 head.js

    有没有人成功整合过pubnub http www pubnub com 和 head js 正确吗 Pubnub http www pubnub com 希望我将他们的脚本放在页面底部并带有 div 就在它前面的标签 这可以确保在最后调用
  • Angular 2 Material 2 日期选择器日期格式

    我不知道如何更改材料2日期选择器的日期格式 我已阅读文档 但我不明白我实际上需要做什么 datepicker默认提供的输出日期格式为f e 6 9 2017 我想要实现的目标是将格式更改为类似的格式9 Jun 2017或任何其他 文档htt
  • 不明白 Swift 中的闭包示例

    我正在尝试了解 swift 和闭包 我被这个例子困住了 numbers map number Int gt Int in let result 3 number return result 什么是 number Int gt Int 它是一
  • window.onbeforeunload 在 Android Chrome 上不会触发 [alt.解决方案?]

    我开发了一个简单的聊天应用程序 我正在使用 window onbeforeunload当有人关闭选项卡 浏览器时 基本上是当用户离开房间时 通知其他用户 这是我的代码 scope onExit function scope chatstat
  • 限制可选 DOM 复选框

    我试图限制用户可以选择的复选框数量 这些复选框是为数组中的每个项目生成的 DOM 输入对象 我目前对此没有运气 因此非常感谢任何帮助 谢谢 在这里小提琴 http jsfiddle net vVxM2 222 http jsfiddle n
  • 了解 sort() 比较函数

    我正在使用一个电子商务平台 该平台无法重新排序产品属性字段的选项 这真的很糟糕 因为要插入新选项 您几乎必须删除所有现有选项并重新开始 我正在尝试在客户端进行操作 这是我正在处理的内容 这是针对鞋码的 9 EE 9 1 2 EE 10 EE
  • javascript jquery 使用脚本更改脚本的src

    我有一个 JavaScript 脚本 它有一个 src 元素 这个 src 是一个 url 我想使用 javascript 更改它 一次更改为其他内容 或者动态创建它 使用 javascript jquery 动态创建脚本元素的最佳方法是什
  • 使用 JavaScript 生成 PDF 文件

    我正在尝试将 XML 数据从网页转换为 PDF 文件 并且希望能够完全在 JavaScript 中完成此操作 我需要能够绘制文本 图像和简单的形状 我希望能够完全在浏览器中完成此操作 我刚刚写了一个名为jsPDF https github
  • ToggleClass 动画 jQuery?

    我的网站上有一个部分 当用户单击时我希望它展开 我正在使用 jQuerytoggleClass为了这 expandable function e e preventDefault this closest article toggleCla
  • JavaScript 测验在提出所有问题之前结束

    我现在正在学习 JavaScript 并且正在创建一个测验 我的测验运行正常 控制台中没有任何错误 但它会跳过问题 有时会在回答所有问题之前结束测验 即使给出正确答案 也会减少时间 我不太确定为什么它会这样做 因为在我看来它的编码是正确的
  • 在 Fabric.js 中按宽度/高度在另一个画布对象内居中和缩放画布对象

    Goal 将一个对象 水平和垂直 置于另一个对象 矩形或组 的中心canvas via Fabric js或者通过Javascript保持原始对象的长宽比相同 但也不超过父对象的宽度 高度比例 父对象 矩形或组 不会居中于canvas元素
  • 如何打开弹出窗口并用父窗口中的数据填充它?

    如何使用 JavaScript jQuery 使用父页面中 JS 变量的数据填充弹出窗口 在我的示例中 我有一个文件名数组 我在父窗口中最多列出五个 如果还有更多 我想提供一个链接来打开弹出窗口并列出数组中的每个帖子 因此 如果我打开一个包
  • 计算文本选择的 xy 位置

    我正在尝试使用 DOM 元素创建自己的文本选择 是的 我的意思是当您在此元素中选择文本时 您会在文本后面看到蓝色背景 这个想法是停止默认行为 蓝色 并使用我自己的元素来完成工作 方法是找到选择的 xy 位置 然后放置绝对定位的元素 我希望能
  • 如何处理requireJs超时错误?

    我正在使用 require js 作为加载框架编写一个移动混合应用程序 我遇到加载错误的问题 我想做的是在设备离线且无法下载在屏幕上显示地图所需的 google 地图 API 脚本时设置后备解决方案 我得到的只是 Uncaught Erro
  • Ember Data 中出现“超出最大调用堆栈大小”错误的原因可能是什么?

    Ember 发布新版本 3 6 0 后 我开始在控制台中收到错误 rsvp js 24 未捕获 RangeError 超出最大调用堆栈大小 在 WeakMap get 在 getCacheFor metal js 25 在 Computed
  • 使用 AngularJS 多部分表单数据将文件上传到 Google Cloud Storage

    我正在尝试使用 AngularJS 中指定的多部分方法将图像文件上传到 Google Cloud Storagehttps cloud google com storage docs json api v1 how tos upload m
  • mozilla pdf.js 没有全视图

    我喜欢这个 pdf 查看器https github com mozilla pdf js https github com mozilla pdf js Demo http mozilla github com pdf js web vie

随机推荐

  • 如何将 DataGridView 定位到特定行(以便所选行位于底部)?

    作为一个类似的问题这个问题 我还有一个带有 DataGridView 的应用程序 我想定位行 使特定行位于列表可见部分的底部 这是对将一行向下移动一位的按钮单击的响应 我想保留我正在移动的行上的选择 我已经让这部分工作 如果有很多行 所选行
  • 将数组从一页传递到另一页

    我有一个包含一些值的数组 比如说 arr one one value here arr two second value here arr three third value here 我这个值位于页面 home php 中 在页面末尾 它
  • dart:js 和 js 包有什么区别?

    Dart 文档中的所有地方都建议使用js用于 JavaScript 互操作性的包 然而 我最近发现dart jsSDK 中存在似乎具有相似 但不相同 接口的包 这些包之间有什么区别吗 它们的功能相同吗 推荐哪一款 Js 互操作始于包 js
  • application.yml 中的 @Value 返回错误值

    In my application yml文件声明 service a b 011600 c 011200 从中选择值 yml via Value注解 Value service a c private String VALUE 我得到的不
  • Python - 像扩展函数一样扩展属性

    Question 如何扩展 python 属性 子类可以通过在重载版本中调用超类的函数来扩展超类的函数 然后对结果进行操作 下面是我所说的 扩展函数 的一个例子 Extending a function a tongue in cheek
  • 将毫秒转换为天、小时、分钟和秒

    我在 Microsoft SQL Server 2008R2 中有一个 bigint 字段 里面充满了刻度 单个刻度代表一百纳秒或百万分之一秒 一毫秒有 10 000 个刻度 http msdn microsoft com en us li
  • WCF 发现返回硬编码 URL

    总体设计如下 有某些应用程序作为 Windows 服务安装 网络上可能有几个这样的 它们每个都向网络公开一些接口 将其视为 远程控制 或 配置 诸如此类的东西 然后还有另一个应用程序充当该接口的客户端 使用相同的类比 远程控制器 或 配置工
  • makefile:4: *** 缺少分隔符。停止

    这是我的生成文件 all ll ll ll c gcc c Wall Werror 02 c c ll c o ll lt clean rm fr ll 当我尝试make clean or make make 我收到此错误 makefile
  • 处理临时文件流

    假设我想定义一个 TempFileStream 类 它使用 Path GetTempFileName 方法创建临时文件 当不再需要 TempFileStream 的对象时 必须删除临时文件 例如关闭或处置 class TempFileStr
  • 确定哪个编译器构建了 Win32 PE

    如何确定使用哪个 C 或 C 编译器来构建特定的 Windows 可执行文件或 DLL 一些编译器会在最终的可执行文件中留下版本字符串 但这在 Windows 上似乎比在 Linux 上更罕见 具体来说 我感兴趣的是区分 Visual C
  • 如何在 Bash 中将字符串与多个正确值进行比较?

    我有以下 Bash 脚本 function get cms echo input cms name read cms cms cms if cms wordpress cms meganto cms typo3 then get cms f
  • 当某些 appspec 挂钩失败时,如何使 AWS CodeDeploy 返回错误?

    我有一个带有两个实例的 AWS 我已将 CodeDeploy 配置为在所有实例上自动部署我的项目 In the appspec yml我有该部分 hooks AfterInstall location codedeploy scripts
  • Windows 窗体应用程序最常见的设计模式是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我问这个问题是因为我将使用
  • 为什么我应该在函数中使用 c_str() [重复]

    这个问题在这里已经有答案了 我正在阅读 C Primer 一书 并在它使用的文件输入输出章节中 ifstream infile ifile c str 打开名称在字符串中的文件ifile 我尝试了该代码 即使没有 它也能完美运行c str
  • 是否可以选择跨度的堆叠顺序?

    我正在使用 Twitter Bootstrap 启动一个项目 就像响应式 css 一样 当视口变小时 使跨度堆叠在一起 给出以下设计 http jsfiddle net kJp6J 1 是否可以选择在小屏幕上首先堆叠哪个块 就我而言 我希望
  • 如何从 Visual Studio 项目中排除文件/文件夹?

    我找不到任何选项或命令来将文件或文件夹从我的 Visual Studio 项目中排除 csproj jsproj 可以选择在解决方案资源管理器中包含文件和文件夹 gt 显示所有文件 gt 鼠标左键单击目标 gt 包含在项目中 但没有选择ex
  • MFC:如何在C菜单项中添加工具提示?

    如何为 CMenu 项目添加工具提示 我找不到任何简单且有用的资源 请帮忙 谢谢 最简单的方法是将多个字符串传递给菜单文本 并用换行符分隔 这将自动使 CMenu 显示文本的第二部分作为菜单工具提示 例如 如果菜单项文本是 单击此处 请将其
  • Heroku 应用程序崩溃,在尝试 heroku rake db:migrate 时收到“无效的数据库 URL”

    我是编程新手 当我在尝试 heroku rake db migrate 时遇到此问题时 正在遵循 Michael Hartl 的 Rails 教程 in app app bundle gems ruby 1 9 1 gems rake 0
  • OnClientClick 中的服务器标记

    以下给出了 服务器标记格式不正确 的错误
  • 调试揭示模块模式:函数在调用之前不在范围内?

    如果我在 Chrome 开发者工具中运行此代码 var test function var publicFunction privateFunction1 privateFunction2 privateFunction1 function