我们知道在其它编程语言中, 都有包(命令空间)的概念, 帮助我们更好的管理代码结构. 如java中的package, python中的module. 但是在js语言中, 在一个页面执行环境内, 所有引入的外部的js文件都会在同一个global上下文中执行, 做不到几点: 不能动态加载我们只需要的模块; 没有package的概念, 代码管理混乱. 虽然语言这一层次做不到, 但是从上面一层可以做到, 所以就有了AMD规范标准: Asynchronous module definition.

假设我们现在的文件目录如下:

我们在amd.html里定义两个核心函数: require和define

var modules = {};
var defQ = []; function onLoad(script, module){
script.addEventListener("load", function(){
var defFactory = defQ.shift();
module.def = defFactory;
module.executed = 1;
}, false);
} function require(deps, callback){
for(var i = 0; i < deps.length; i++){
var module = {
executed: 0,
url: deps[i]
}; var script = document.createElement("script");
script.type = "text/javascript";
script.src = deps[i];
script.charset = "utf-8";
onLoad(script, module); modules[deps[i]] = module; document.body.appendChild(script);
} var id = setInterval(function(){
var args = [];
for(var i = 0; i < deps.length; i++){
var dep = modules[deps[i]];
if(!dep.executed){
return;
}else{
args.push(dep.def());
}
} clearInterval(id);
callback.apply(null, args);
}, 1000); }; function define(factory){
defQ.push(factory);
}

现在我们定义了两个js模块文件: my/a.js和my/b.js, 分别如下:

// my/a.js
define(function(){
return {
name: "tony"
}
});
// my/b.js
define(function(){
return {
name: "lily"
}
});

现在我们可以在其它任何一个地方来动态加载这两个模块文件了, 使用如下:

require(['js/my/a.js', 'js/my/b.js'], function(a, b){
console.debug(a.name + " " + b.name);
});

上面的require和define只是一个简单的AMD思路, 实际中复杂得多, 如要处理循环信赖等等复杂的情况.

Javascript AMD学习的更多相关文章

  1. javascript立体学习指南

    javascript立体学习指南第一章:首先了解javascript 首先,什么是javascript? JavaStrip出生于1995年,是一种文本脚本语言,成都装修公司是一种动态的.弱类型的.基 ...

  2. 正则表达式(javascript)学习总结

    正则表达式在jquery.linux等随处可见,已经无孔不入.因此有必要对这个工具认真的学习一番.本着认真.严谨的态度,这次总结我花了近一个月的时间.但本文无任何创新之处,属一般性学习总结. 一.思考 ...

  3. 大量Javascript/JQuery学习教程电子书合集

    [推荐分享]大量Javascript/JQuery学习教程电子书合集,送给有需要的人   不收藏是你的错^_^. 经证实,均可免费下载. 资源名称 资源大小   15天学会jQuery(完整版).pd ...

  4. [推荐分享]大量Javascript/JQuery学习教程电子书合集,送给有需要的人

    不收藏是你的错^_^. 经证实,均可免费下载. 资源名称 资源大小   15天学会jQuery(完整版).pdf 274.79 KB   21天学通JavaScript(第2版)-顾宁燕扫描版.pdf ...

  5. JavaScript 基础学习1-day14

    JavaScript 基础学习1 知识预览JavaScript概述二 JavaScript的基础三 JavaScript的对象BOM对象DOM对象实例练习js扩展 JavaScript概述 JavaS ...

  6. JavaScript正则表达式学习笔记(二) - 打怪升级

    本文接上篇,基础部分相对薄弱的同学请移步<JavaScript正则表达式学习笔记(一) - 理论基础>.上文介绍了8种JavaScript正则表达式的属性,本文还会追加介绍几种JavaSc ...

  7. 初步总结javascript中学习DOM之前的知识

    嘿嘿,又到了周末时间,周六其实就是总结这周的学习的,记得周二周三刚开始接触javascript时间,还是不知道怎么学习的,就感觉找不到方向,那时间学习的只是总结了一些简单的定义或者是学习结构,今天就把 ...

  8. JavaScript紧凑学习

    JavaScript紧凑学习 windows本地,调用命令行: win键+R 键入cmd , (cmd是Command 命令行 简称) 目录是C盘下的 C:\Users\Administrator&g ...

  9. javascript正则表达式 - 学习笔记

    JavaScript 正则表达式 学习笔记 标签(空格分隔): 基础 JavaScript 正则表达式是用于匹配字符串中字符组合的模式.在javascript中,正则表达式也是对象.这些模式被用于Re ...

随机推荐

  1. ACM: 限时训练题解-Street Lamps-贪心-字符串【超水】

    Street Lamps   Bahosain is walking in a street of N blocks. Each block is either empty or has one la ...

  2. 转:jQuery插件开发精品教程,让你的jQuery提升一个台阶

    要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样,得平台者得天下.苹果,微软,谷歌等巨头,都有各自的平台及生态圈 ...

  3. [Cocos2d-x For WP8]Layer 层

        层(CCLayer) 从概念上说,层就是场景里的背景. CCLayer同样是CCNode的子类,通常用addChild方法添加子节点.CCLayer对象定义了可描绘的区域,定义了描绘的规则.C ...

  4. git 设置多项目实现多账号登陆

    9:45 2015/11/18git 设置多项目时实现多账号用户登陆git config --global user.name "your_name" git config --g ...

  5. BZOJ2330 糖果题解 查分约束

    BZOJ 2330 糖果题解 差分约束系统 + SPFA 题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2330 Description ...

  6. 【BZOJ】2237: [NCPC2009]Flight Planning

    题意 \(n(1 \le n \le 2500)\)个点的树,求删掉一条边再加上一条边使得还是一棵树,且任意两点最大距离最小. 分析 考虑枚举删掉每一条边,我们只需要考虑如何加边容易求得新树的最大距离 ...

  7. OLTP与OLAP的介绍

    OLTP与OLAP的介绍 数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing).联机分析处理OLAP(On-Line Analytical ...

  8. Linux下mongodb的安装及启动

    安装 1>设置mongoDB目录 cd /home/apps 附:centOS下创建目录命令  mkdir /home/apps 2>下载mongodb curl -O http://fa ...

  9. 使用数据泵导入(impdp)和导出(expdp)

    数据泵技术是Oracle Database 10g 中的新技术,它比原来导入/导出(imp,exp)技术快15-45倍.速度的提高源于使用了并行技术来读写导出转储文件. expdp使用 使用EXPDP ...

  10. traits的使用

    trait的作用是可以在任何地方使用trait中的方法. trait的定义与定义类相同,定义实例如下: trait tSoneTrait{ //定义一些属性 function someFunction ...