javascript 模块模式来自《你不懂 JS》

2023-12-31

我已经阅读和测试下面的代码几个小时了,但我似乎无法理解某些事情。 我一直在逐步浏览 chrome 控制台,基本上在我可以添加的每一行中都插入了中断,并且一直在检查,但我只是不确定事情

1)我只是不确定 deps 数组的用途。对我来说第一件奇怪的事情是,为什么脚本不尝试在第一次调用它时添加数据(来自MyModules.define("bar",[],function())? 为什么脚本会第二次调用define(MyModules.define("foo",["bar"], function(bar))然后将 ["bar"] 添加到数组中,而第一个定义应该首先完成它?

2)这段代码modules[name] = impl.apply(impl,deps)。每个回调,不要使用“this”..所以这里有必要应用吗?另外,这可能是我对使用“apply”时的回调缺乏理解,但是如何理解这一点呢?我认为“申请”通常是functionName.apply(obj,[])

在这种情况下,这几乎就像是说functionName.apply(functionName, []) ??或者这是不同的,因为函数本身是匿名的?

    var MyModules = (function Manager() {
        var modules = {};

        function define(name,deps,impl) {
            for ( var i=0; i<deps.length; i++) {
                deps[i] = modules[deps[i]];
            }
            modules[name] = impl.apply(impl,deps);
        }

        function get(name) {
            return modules[name];
        }

        return {
            define : define,
            get: get
        };
    })();

    MyModules.define("bar",[],function() {
        function hello(who) {
            return "Let me introduce: " + who;
        }

        return {
            hello : hello
        };
    })

    MyModules.define("foo",["bar"], function(bar) {
        var hungry = "hippo";

        function awesome() {
            console.log(bar.hello(hungry).toUpperCase() );
        }

        return {
            awesome: awesome
        };
    });

    var bar = MyModules.get("bar");
    var foo = MyModules.get("foo");

    console.log(bar.hello("hippo"));

    foo.awesome();

我只是不确定这样做的目的deps array.

你似乎对整体的目的感到困惑MyModules反对,不是吗?

The define方法可用于声明一个模块,带有名称、依赖项数组和工厂函数:

  • The name是模块对象将存储在其中的字符串modules字典
  • The deps数组包含当前声明的模块所依赖的模块的名称。
  • The impl函数将被调用来创建模块对象,该对象将在name。它确实传递了模块对象,这些对象的名称在deps数组已解决。

为什么脚本不尝试在第一次调用它时放入数据(来自MyModules.define("bar",[],function())?为什么脚本第二次调用定义(MyModules.define("foo",["bar"], function(bar))?

这意味着声明一个名为的模块bar没有任何依赖项,并声明一个具有名称的模块foo这取决于bar。通常,这两个声明将放置在不同的脚本中。

这段代码modules[name] = impl.apply(impl,deps)- 每个回调,不要使用“this”..所以这里有必要应用吗?

Yes, apply https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply这里有必要将任意多个参数传递给函数。然而,通过impl函数为this值确实没有任何意义,null放在这里会更合适。

更好、更容易理解的定义是

function define(moduleName, dependencyNames, factory) {
    var dependencies = [];
    for (var i=0; i<dependencyNames.length; i++) {
        dependencies[i] = get(dependencyNames[i]); // resolve name
    }
    modules[moduleName] = factory.apply(null, dependencies);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javascript 模块模式来自《你不懂 JS》 的相关文章

随机推荐

  • MySQL 分组依据和跳过对空值的分组

    select from dc deal group by collection id 在 collection id 列中我有值 1 3 3 4 4 5 空 空 上面的查询将返回行 1 2 3 4 空 但我想跳过对 NULL 值的分组并需要
  • HierarchyID:获取父母列表的所有后代 - 不起作用

    我正在处理这个线程 HierarchyID HierarchyID 获取父母列表的所有后代 https stackoverflow com questions 25079528 hierarchyid get all descendants
  • jQuery:将层次结构序列化为 Json

    假设我有一个嵌套的无序列表 我想将其序列化为 json 使用 jQuery 实现此目的的最佳方法是什么 如果有人需要的话 这是解决方案 document ready function var root root var jsonObj js
  • ReactJS - {this.props.children} 未定义

    我看过很多与此论点相关的帖子 但我无法理解为什么 this props children 在我的应用程序中未定义 我对 ReactJS 很陌生 从 开始App js这是我的主要组成部分我有这个 import React Component
  • 具有动态表单的 Django FormWizard

    我想实现一个简单的两部分 FormWizard 表格 1 将动态生成如下内容 class BuyAppleForm forms Form creditcard forms ChoiceField widget forms RadioSele
  • 安卓;地理编码器,为什么我收到“服务不可用”?

    我想在 Android 应用程序中使用地理编码器 我有以下代码片段来对其进行采样 public class LocatorGeo extends Activity Called when the activity is first crea
  • 不使用循环按位反转整数

    我想编写一个程序来反转整数的位 例如 11000101 至 10100011我知道如何使用循环来解决这个问题 但我遇到了使用字节移位来解决这个问题的解决方案 num gt gt 4 num lt lt 4 我不明白这是如何工作的 有人可以帮
  • R 数据框的实际限制

    我一直在阅读有关 read table 对于大型数据文件如何效率不高的信息 另外 R 不适合大型数据集 所以我想知道在哪里可以找到实际限制以及任何性能图表 1 读取不同大小的数据 2 处理不同大小的数据 实际上 我想知道性能何时恶化以及何时
  • 如何使用jsPDF在PDF中显示两页图像?

    我有一个 html 页面 其中我有一个按钮 每当我单击此按钮时 它都会使用 html2canvas 将整个 html 页面转换为数据图像 并使用 jsPDF 库将其放入 PDF 中 我正在使用的javascript是 printButton
  • 检测用户是否通过 javascript 打印内容

    我在检测 javascript 中的打印事件时遇到问题 例如 用户想要打印文档并在网页中按下打印 然后出现另一个窗口 例如从 Adob e Reader 进行打印 然后会出现 Adob e Reader 的另一个窗口 您可以在其中设置属性
  • 将所有 XML 特殊字符转换回常规字符(在 SQL 内)

    如何将 XML 中的所有特殊字符转换为 ASCII 值 例如 DECLARE xml XML SELECT abc xyz gt lt FOR XML PATH SELECT xml xml is now abc amp xyz gt lt
  • 如何解决具有 -ms-transform:translate 的固定位置父级的 IE9 滚动重绘问题?

    我有一个父 div 具有 ms transform translateX 50 translateY 40 位置 固定 我的内部子 div 具有固定高度和溢出 auto 在 IE9 仅真正的 IE9 中 这会导致奇怪的滚动问题 它无法正确重
  • 如何使用 PowerShell 批量重命名文件?

    我正在尝试递归地重命名一堆TFS http en wikipedia org wiki Team Foundation Server文件夹使用tf rename 电源外壳 http en wikipedia org wiki Windows
  • 从 angularjs 中的验证中删除最后一个 ng-form

    I have a master detail form in angularjs The form is typical transactions form with some master data like Name type etc
  • Storyboard 和 xib 在同一项目中使用

    我对 Objective C 中的类如何工作的理解可能是一个根本性的误解 我正在使用故事板 但在这个应用程序中 我想为我的视图控制器之一上的文本字段创建一个简单的自定义日期选择器视图 但是 我似乎在从视图控制器访问日期选择器类的任何属性时遇
  • 在没有任何“order by”语句的情况下,数据库服务器如何决定返回行的顺序?

    这是一个异想天开的问题 一直是我想知道的问题 我想知道它为什么会这样做可能会加深我的理解 假设我执行 SELECT TOP 10 FROM TableName 在很短的时间内 相同的 10 行又回来了 所以看起来不是随机的 它们不是第一个或
  • 如何从 Python/NumPy 列表中删除 Nan

    我有一个包含值的列表 我得到的值之一是 nan countries nan USA UK France 我尝试删除它 但每次都会出现错误 cleanedList x for x in countries if math isnan x Tr
  • tkinter 同时使用两个键

    所以 tkinker 一次只能使用一把钥匙 在这个例子中 我无法同时向左和向上移动 如果我愿意的话 我会怎样去做呢 import tkinter root tkinter Tk root title test c tkinter Canva
  • 为什么我收到错误 CS0246:找不到类型或命名空间名称?

    我在用咆哮 C API https github com TlhanGhun Snarl Network Protocol Csharp blob master SnarlNetwork cs向 snarl 发送通知 现在我已将上述网址的内
  • javascript 模块模式来自《你不懂 JS》

    我已经阅读和测试下面的代码几个小时了 但我似乎无法理解某些事情 我一直在逐步浏览 chrome 控制台 基本上在我可以添加的每一行中都插入了中断 并且一直在检查 但我只是不确定事情 1 我只是不确定 deps 数组的用途 对我来说第一件奇怪