1、AMD简介

  AMD,全称 Asynchronous Module Definition,即异步模块加载机制。AMD 规范非常简单只有一个API,即 define 函数:

define([module-name?],[array-of-dependencies?],[module-factory-or-object]);

其中,

  • module-name:模块标识,可以省略
  • array-of-dependencies:所依赖的模块数组,可以省略
  • module-factory-or-object:模块的实现或者一个 JavaScript 对象

  define 函数具有异步性,其首先会异步加载第二个参数中列出的依赖模块,当所有的模块被加载后,执行第三个参数的回调函数。

2、define 函数使用

(1)三个参数

define("A", ["require", "exports"], function(require, exports){export.fun = function(){return require("B").fun;}
});

  上述代码定义了一个 A 模块,并且依赖于内置的 require,exports 模块,第三个参数是回调函数,可以直接使用依赖的模块,他们按依赖声明顺序作为参数提供给回调函数。
  require 函数是用来模块依赖,即获取模块的引用,即使模块没有作为参数定义,也能够被使用;exports 定义 A 模块实体,在其上定义的任何属性和方法就是 A 模块的属性和方法。通过 exports.fun= … 就是为 A 模块定义了一个 fun 方法。
(2)两个参数
  define 函数允许省略第一个参数,因此定义一个匿名模块。这时候模块文件的文件名就是模块标识,即如果这个模块文件名为 A.js ,那么 A 就是模块名。可以在依赖项目中用 A 来依赖于这个匿名模块。这将带来一个好处,就是模块的高度可重用的。你拿来一个匿名模块,随便放在一个位置就可以使用它,模块名就是它的文件路径。这也很好的符合了 DRY(Don’t Repeat Yourself)原则。

define(['A'], function(A){return {fun: function(){return A.fun() + 2;}};
});

(3)一个参数
   define 的前面两个参数都可以省略;第三个参数有两种情况:一钟是 JavaScript 对象,另一种是一个函数。
  如果是对象,可以是包含方法的对象或者是只提供数据。后者和 JSONP非常类似,因此,AMD可以认为包含了一个完整的JSONP实现。模块演变为一个简单的数据对象,这样的数据对象是高度可用的,而且因为是静态对象,它也是CDN友好的,可以提高JSONP的性能。
  如果是函数,其用途之一是快速开发实现。适用于较小型的应用,该方式无需提前考虑需要引入的模块,只需使用时,require 即可。

define(function(){var a = require("A");
})

define函数在执行的时候,会调用函数的 toString 方法,并扫描其中的 require 调用,提前载入这些模块,载入完成后再执行。
注意:Opera 不能很好的支持函数的 toString 方法,因此,在浏览器中它的适用性并不强。但是使用构建工具打包时,构建工具会扫描 require 并强制载入依赖模块。

3、AMD 与 CMD 的区别是:

  • AMD 是提前执行,CMD 是推迟执行,
  • CMD 推崇依赖就近,AMD推崇依赖前置。
    即 CMD:

    define(function(require, exports, module){var a = require('./a);a.doSomething();var b = require('./b');b.doSomething();    })
    

    AMD:

    define(['./a','./b'], function(a, b){})
    

AMD define函数相关推荐

  1. 如何理解 SAP UI5 的 sap.ui.define 函数

    Understanding sap.ui.define by Hello World 随着 1.28 版本中 sap.ui.define 函数的引入,SAPUI5 引入了对异步模块定义 (AMD) 的 ...

  2. require js define 函数

    模块不同于传统的脚本文件,它良好地定义了一个作用域来避免全局名称空间污染.它可以显式地列出其依赖关系,并以函数(定义此模块的那个函数)参数的形式将这些依赖进行注入,而无需引用全局变量.RequireJ ...

  3. require js之define 函数

    随时随地技术实战干货,获取项目源码.学习资料,请关注源代码社区公众号(ydmsq666) from:http://blog.csdn.net/u010130282/article/details/52 ...

  4. js define函数_聊聊JS模块化发展历程

    1 引言 如今,Javascript 模块化规范非常方便.自然,但这个新规范仅执行了2年,就在 4 年前,js 的模块化还停留在运行时支持,10 年前,通过后端模版定义.注释定义模块依赖.对经历过来的 ...

  5. define函数的用法

    define define,宏定义,C语言中 预处理命令 一种.分为无参宏定义和带参宏定义. 无参宏定义 的一般形式为:#define 宏名 字符串: 带参宏定义 的一般形式为:#define 宏名( ...

  6. python中define函数_Python中的函数

    函数基础 01. 函数的快速体验 1.1 快速体验 所谓函数,就是把 具有独立功能的代码块组织为一个小模块,在需要的时候 调用 函数的使用包含两个步骤: 定义函数 -- 封装独立的功能 调用函数 -- ...

  7. define 函数定义注意

    代码 #include <errno.h> #include <math.h> #include <stdio.h> #include <stdlib.h&g ...

  8. js define函数_不夸张,这真的是前端圈宝藏书!360前端工程师Vue.js源码解析

    优秀源代码背后的思想是永恒的.普适的. 这些年来,前端行业一直在飞速发展.行业的进步,导致对从业人员的要求不断攀升.放眼未来,虽然仅仅会用某些框架还可以找到工作,但仅仅满足于会用,一定无法走得更远.随 ...

  9. JS忍者秘籍读书笔记(已完结)

    1.函数也可以添加属性 利用计算素数的例子来说明:可以通过函数的属性来缓存结果,提升性能. 这里是函数的属性,用this的话会绑定到window上,函数创建默认this为window function ...

最新文章

  1. 【转】Android下编译jni库的二种方法(含示例) -- 不错
  2. XSKY发布两款存储产品 以Ceph为核心
  3. 【技术分享】如何解锁高通骁龙660上的安卓引导加载程序
  4. Android复习01(内部存储、外部存储、SD卡存储、XML解析、Json解析、保存登录密码)
  5. ubuntu18.04利用fdisk找到磁盘空闲区,新建分区,挂载
  6. 进程相关概念、C程序的空间分配
  7. bzoj 4596: [Shoi2016]黑暗前的幻想乡
  8. python爬取歌词_利用Python网络爬虫抓取网易云音乐歌词
  9. Intellij IDEA 14.x 菜单项中Compile、Make和Build的区别
  10. 数据库备份与恢复 之四 选择数据库还原方案
  11. printf() 输出控制符
  12. 一分钟学会清理垃圾运行命令
  13. KEIL5芯片包器件库的下载
  14. scrapy项目-爬取阳光问政
  15. 计算机主机cpu内存,两分钟看懂计算机中CPU、内存、硬盘的工作原理
  16. CTC,RNN-Transducer, LAS
  17. PLC实训3:计数器控制电机循环启停
  18. 原来小米手机这么好用,这4大功能,各个都是黑科技,厉害了
  19. 苹果酸-天冬氨酸穿梭
  20. 数字集成电路设计-5-pipelining(流水线)

热门文章

  1. 直接在html打开ppt,无需频繁跳转 教你在PPT内直接看网页
  2. [滴滴校招] 连续最大和
  3. 传奇 定时任务(泡点、时间触发、任务活动等)
  4. element table filed显示不全
  5. navicat 表合并查询_navicat怎么合并表格
  6. SpringBoot和Vue验证码
  7. 二级分销系统对企业来说意味着什么?
  8. AireOS WLC配置AP Group
  9. bearer token_接口认证方式:Bearer Token
  10. es6中的静态属性和方法