JavaScript 中嵌套函数的需求和用途是什么

2024-03-12

我理解什么是嵌套函数,但我不明白为什么我们首先需要嵌套函数。 JavaScript 中是否存在只能使用嵌套函数才能解决的问题。我看到的所有创建嵌套函数的示例都可以在无需在函数内部创建函数的情况下进行编码,并且结果相同。那么哪些问题需要创建嵌套函数,并且只能/有效地通过使用嵌套函数来解决。


嵌套函数的核心重要性是作用域生成。我们需要 JavaScript 中的嵌套函数和作用域来实现以下目的。

  1. 无污染的全局命名空间 https://stackoverflow.com/questions/8862665/what-does-it-mean-global-namespace-would-be-polluted
  2. 模块化 http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html功能性的
  3. 封装私有内部运作modules http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html
  4. 防止不同脚本之间的标识符冲突
  5. 由于嵌套作用域内的变量符合以下条件,因此脚本大小较小缩小化 https://en.wikipedia.org/wiki/Minification_(programming).
  6. 它加快了标识符解析过程 http://davidshariff.com/blog/javascript-scope-chain-and-closures/

下面是一个示例模块,显示了函数嵌套和作用域提供的封装的强大功能:

var notificationService = (function ($, toastr, undefined) {
    var _externals = {},
        _jqExtend = $.extend;

    /*
     * Private Methods
     */
    function _showMessage(params) {
        params = params || {};
        toastr.remove();

        if (typeof (params.title) === "undefined")
            toastr[params.method](params.msg);
        else
            toastr[params.method](params.msg, params.title);
    }

    /*
     * Public Members
     */
    _externals.clear = function () {
        toastr.remove();
    };

    _externals.showError = function (params) {
        params = params || {};

        _jqExtend(params, {
            method: "error"
        });

        _showMessage(params);
    };

    _externals.showInfo = function (params) {
        params = params || {};

        _jqExtend(params, {
            method: "info"
        });

        _showMessage(params);
    };

    _externals.showSuccess = function (params) {
        params = params || {};

        _jqExtend(params, {
            method: "success"
        });

        _showMessage(params);
    };

    _externals.showWarning = function (params) {
        params = params || {};

        _jqExtend(params, {
            method: "warning"
        });

        _showMessage(params);
    };

    return _externals;
})(jQuery, toastr);

上面的代码使我们能够控制要公开的内容。在这种特定情况下,附加到 _externals 对象的所有成员都通过对 notificationService 对象的引用公开到全局命名空间。如果不使用作用域,内部成员(_jqExtend 和 _showMessage)也将附加到窗口对象,并增加浏览器解析标识符引用所需的工作量。

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

JavaScript 中嵌套函数的需求和用途是什么 的相关文章

  • MailTo 从 Javascript

    我有一个链接按钮 用于从页面内容构建邮件 从 javascript 启动它而不打开空白窗口或干扰调用它的窗口的最佳方法是什么 function Email var sMailTo mailto var sBody var alSelecte
  • 如何在 DOM 中的每个元素中调用函数,即使它们是动态创建的

    我想对 DOM 上的特定元素调用函数 例如 red css backgroundColor pink 它适用于 DOM 中已经存在的任何元素 但我也希望在动态添加到 DOM 的元素中调用此方法 我尝试过类似的事情 red on functi
  • 使用 jQuery Select2 清除下拉菜单

    我正在尝试使用奇妙的方式以编程方式清除下拉菜单Select2 http ivaynberg github com select2 图书馆 使用 Select2 远程 ajax 调用动态填充下拉列表query option HTML
  • Mapbox GL 中的 MaxBounds 和自定义非对称填充

    我有一个 Mapbox GL JS 应用程序 在地图上显示一些小部件 为了确保地图上的任何内容都不会被它们隐藏 我使用以下命令添加了一些填充map setPadding 这是一个不对称的 在我的例子中左边比右边大 它按预期工作 例如fitB
  • 检测 Google 验证码的挑战窗口何时关闭

    我正在使用谷歌隐形验证码 有没有办法检测挑战窗口何时关闭 我所说的挑战窗口是指您必须选择一些图像进行验证的窗口 目前 我在按钮上放置了一个旋转器 一旦单击按钮 就会呈现验证码挑战 无法向用户提示另一个质询窗口 我以编程方式调用渲染函数 gr
  • 访问 nuxt 配置文件中的存储

    我想添加通过 Nuxt 静态生成的动态路由 我定义了一个客户端 服务器端存储asyncData方法 我想将这个存储值 一个数组 映射到我的nuxt config js文件使其成为 动态 静态 路线图nuxt generate命令 但如何访问
  • React JS 服务器端问题 - 找不到窗口

    你好 我正在尝试在我的reactJS项目中使用react rte 我有服务器端渲染 每次我想使用这个包时 我都会得到 return msie 6 9 b test window navigator userAgent toLowerCase
  • 为什么这行带有“await”的代码会触发微任务队列处理?

    以下引用是我理解微任务队列处理的主要参考 当 JS 堆栈清空时 就会处理微任务 承诺使用 杰克 阿奇博尔德 https twitter com jaffathecake status 954653170986311680 这对我来说没有意义
  • 为什么在 JavaScript 中 if([]) 被验证而 [] == false ?

    if false alert empty array is false alert alert 0 if alert empty array is true 他们都会运行警报 Demo http jsfiddle net roine ZFD
  • 如何在 Web 服务器上设置 gzip 压缩?

    我有一个嵌入式网络服务器 总共有 2 兆空间 通常 您使用 gzip 文件对客户端有利 但这会节省我们在服务器上的空间 我读到你可以只 gzip js 文件并将其保存在服务器上 我在 IIS 上测试过 但没有任何运气 为了使这项工作成功 我
  • 使用 JQuery 禁用和启用所有超链接

    我有以下禁用所有超链接的内容 但在事件发生后我想再次启用它们 我该如何执行此操作 a click function return false 我认为这不仅仅是将其设置为 true 那么简单 谢谢大家 不要以这种方式绑定 点击 处理程序 而是
  • 如何使用新的analytics.js跟踪多个帐户?

    我需要使用 Google 的新的analytics js 跟踪一个页面上两个帐户的综合浏览量 有大量教程和示例如何使用较旧的 ga js 进行操作 但我发现的只是这个分析文档页面 https developers google com an
  • javascript 是否有等效的 __repr__ ?

    我最接近Python的东西repr这是 function User name password this name name this password password User prototype toString function r
  • 如何重复 ajax 请求,直到满足 RxJS Observable 的条件?

    我正在尝试重复请求 直到响应包含使用 RxJS 的数据 此时我想调用成功 或失败 处理程序 但我在使用 RxJS 时遇到了麻烦 这是我目前的方法 redux observable action observable mergeMap gt
  • ChartJs:如何按时间值(而不是像素)以编程方式平移

    我使用的是chartJs 3 6 1 和 Chartjs plugin zoom 1 2 1 但我认为这并不重要 我有 2 个时间序列折线图 当我通过拖放平移一个图表时 我也想移动 平移另一个图表 为此 我为 graphA 启用了缩放 平移
  • 尝试使用 Javascript 解决对称差异

    我正在尝试找出对称的解决方案 使用 javascript 完成以下任务的差异 目标 接受未指定数量的数组作为参数 保留数组中数字的原始顺序 不删除单个数组中数字的重复项 删除数组中出现的重复项 因此 例如 如果输入是 1 1 2 6 2 3
  • 以角度访问窗口 TemplateUrl 内的范围

    我的模式有一个 windowTemplateUrl 如下 div class modal fade div class modal dialog div class modal content square btn div div div
  • ng-include 和 ng-view 不同时加载

    下面是我的应用程序的结构 很简单 页眉和页脚是非常小的文件 而主页上的 ng view 要大得多 当我进入该页面时 我注意到了这一点 首先加载两个 ng include 然后 ng view 出现 页脚被推到底部 页脚闪烁大约 0 1 秒
  • MongoDB:javascript执行失败:无法在 src/mongo/shell/collection.js 保存 DBQuery 对象

    在 MongoDb 中 当我尝试修改集合中的现有文档时 它会生成以下异常 javascript execution failed can t save a DBQuery object at src mongo shell collecti
  • 将多维数组转换为单数组(Javascript)

    我有一个对象数组 来自 XLSX js 解析器 因此其长度和内容各不相同 表示已给予项目的资助 简化后 它看起来像这样 var grants id p 1 location loc 1 type A funds 5000 id p 2 lo

随机推荐

  • 如何调试 vscode 扩展的 WebView javascript

    我正在构建 vscode 扩展 但无法在 WebView 中的 Javascript 中设置断点 即使 WebView 是一个单独的进程 有没有办法调试 Javascript 具体来说 我正在尝试合并 Telerik TreeView Tr
  • OpenCV 3.4.3 中对“cv::String::deallocate()”错误的未定义引用[重复]

    这个问题在这里已经有答案了 我最近安装了 OpenCV 3 4 3 但 OpenCV 中的一些库没有运行 这是我的示例代码 include
  • 将 Youtube Gdata json 解析为 ListView

    我一直在尝试在 Android 中找到 解析 Youtube Gdata JSON 的工作示例来填充列表视图 我一直在阅读这个问题 https stackoverflow com questions 9555511 android pars
  • RxJava 并行获取 Observables

    我需要一些帮助来在 RxJava 中实现并行异步调用 我选择了一个简单的用例 其中第一个调用获取 而不是搜索 要显示的产品列表 平铺 随后的调用将获取 A 评论和 B 产品图像 经过几次尝试我到达了这个地方 1 Observable
  • 找不到实体框架 4 注释

    我正在尝试使用注释将 POCO 类映射到我的数据库表 我需要使用Table注释来指定我的表的名称 但我无法解析Table注解 注 我导入了System Data Entity命名空间 但它不起作用 我必须导入哪个命名空间才能使用 EF 注释
  • Flutter Admob AppID 使用 Android 还是 iOS?

    当我们在admob控制台中制作AdMob应用程序时 我们可以选择Android或iOS应用程序 这意味着有 2 个不同的 ID 我们应该在 Flutter AdMob 插件中使用哪一个 FirebaseAdMob instance init
  • 如何将 Rails 视图助手提取到 gem 中?

    我有一组经常使用的 Rails 视图助手 并且想将它们打包成一个 gem 这样我就可以在 Gemfile 中添加一行 并从我的视图中访问这些助手 我在使用 Bundler 和 Jeweler 之前已经创建了 gem 但是 我不太清楚如何在
  • 从回溯的角度解释BFS和DFS

    关于深度优先搜索的维基百科 深度优先搜索 DFS 是一种 遍历或搜索的算法 树 树结构或图 一 从根开始 选择一些 节点作为图例中的根 并尽可能地探索回溯之前的每个分支 那么什么是广度优先搜索呢 一种选择起始点的算法 节点 检查所有节点回溯
  • 通过代码隐藏加载silverlight到aspx页面

    我需要通过单击该页面上的按钮在 aspx 页面的一部分中加载 silverlight 应用程序 一些初始化参数需要根据单击按钮时主机页面上的用户输入传递到 silverlight 应用程序 怎么做 我想我需要从代码隐藏创建 silverli
  • python中用于列表操作的plus和append有什么区别? [复制]

    这个问题在这里已经有答案了 可能的重复 Python的append 与列表上的 运算符 为什么它们会给出不同的结果 https stackoverflow com questions 2022031 python append vs ope
  • 如何查看 nginx 尝试访问文件的实际文件路径?

    现在我已经设置了 Nginx 来提供我确信是有效的文件路径的服务 但是 它给了我一个 404 未找到 我看过 var log nginx access log它向我展示了 05 Oct 2016 19 15 50 0500 GET menu
  • PagedListAdapter 不使用 DiffUtil 使数据无效

    每次我调用无效数据时 我的 DIFF UTIL 都不会被使用 日志未显示 整个列表已更新为新数据 导致屏幕移动位置等 不确定这里的问题是什么 I have PagedListAdapter with a LiveData
  • 平方根元函数?

    是否可以使用具有以下签名的元函数计算整数的平方根 template
  • Pandas DataFrame 删除 groupby 中的行

    我有一个包含三列的 DataFrameDate Advertiser和身份证 我首先对数据进行分组 看看某些广告商的列是否太小 例如当count 少于 500 然后我想将这些行删除到组表中 df groupby Date Advertise
  • android 如何动态改变进度条背景颜色

    我想动态改变android中进度条的背景颜色 我遵循本教程页面末尾附近的 奖励 部分 http colintmiller com 2010 10 how to add text over a progress bar on android
  • java Swing 背景图像

    我正在使用 JFrame 并且在框架上保留了背景图像 现在的问题是图像的大小小于框架的大小 所以我必须在窗口的空白部分再次保留相同的图像 如果用户单击最大化按钮 我可能必须在运行时将图像放在框架的空白区域 谁能告诉我如何实现这个目标 听起来
  • 多个服务的WCF之间的共享类型

    我有一个 Java Web 服务器 它有 2 个端点 系统管理和用户管理 两个端点使用相同的库 因此 这两个端点中的几乎所有类都是相同的 我有一个使用这两个服务的 C 客户端 我知道WCF可以共享类 所以我创建了一个新项目 并让我的客户项目
  • [Excel][VBA] 如何在图表中画一条线?

    Please view this image to get my clearly question Sub Tester Dim s d d 4 18 2011 1 a bit of a hack since I could figure
  • 如何使 Flask/保持 Ajax HTTP 连接处于活动状态?

    我有一个 jQuery Ajax 调用 如下所示 tags keyup function event ajax url terms type POST contentType application json data JSON strin
  • JavaScript 中嵌套函数的需求和用途是什么

    我理解什么是嵌套函数 但我不明白为什么我们首先需要嵌套函数 JavaScript 中是否存在只能使用嵌套函数才能解决的问题 我看到的所有创建嵌套函数的示例都可以在无需在函数内部创建函数的情况下进行编码 并且结果相同 那么哪些问题需要创建嵌套