闭包的总结(干货2)--模块机制

现代模块机制:

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
        };
    })();

首先是匿名函数立即运行,返回一个对象,对象包含2个方法,一个定义模块,一个get获取模块

定义模块:     name :定义的模块名,字符串   deps:依赖的列表  impl 模块的实现

apply将deps导入到impl 并返回模块对象存入 modules[name]
 
实际例子:
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" )
); // Let me introduce: hippo
foo.awesome(); // LET ME INTRODUCE: HIPPO
 

未来模块机制

通过模块系统进行加载时,ES6 会将文件当作独立的模块来处理。每个模块都可以导入其他模块或特定的API 成员,同样也可以导出自己的API 成员。

基于函数的API:并不是一个能被稳定识别的模式(编译器无法识别),它们的API 语义只有在运行时才会被考虑进来。因此可以在运行时修改一个模块
                   的API

ES6 模块API :更加稳定,编译期就会检查模块是否存在,ES6没有行内格式,一个文件一个模块 ,引擎有默认的模块加载器,可以导入模块的时候

异步的加载模块文件

bar.js
function hello(who) {
return "Let me introduce: " + who;
}
export hello;
foo.js
// 仅从"bar" 模块导入hello()
import hello from "bar";
var hungry = "hippo";
function awesome() {
console.log(
hello( hungry ).toUpperCase()
);
}
export awesome;
baz.js
module foo from "foo";
module bar from "bar";
console.log(
bar.hello( "rhino" )
); // Let me introduce: rhino
foo.awesome(); // LET ME INTRODUCE: HIPPO

module 整个导入到当前作用域

import 是导入一个或多个API

模块文件中的内容会被当作好像包含在作用域闭包中一样来处理,就和前面介绍的函数闭包模块一样。

模块有两个主要特征:(1)为创建内部作用域而调用了一个包装函数;(2)包装函数的返回值必须至少包括一个对内部函数的引用,这样就会创建涵盖整个包装函数内部作用域的闭包

时间: 2024-08-03 08:40:19

闭包的总结(干货2)--模块机制的相关文章

webpack模块机制浅析【一】

webpack模块机制浅析[一] 今天看了看webpack打包后的代码,所以就去分析了下代码的运行机制. 下面这段代码是webpack打包后的最基本的形式,可以说是[骨架] (function(root,fn){ if(typeof exports ==='object'&&typeof module === 'object'){ module.exports = fn();//exports和module同时存在,说明时在node的CommonJs规范下,这个时候使用module.exp

node的模块机制

Node.js模块的实现 之前在网上查阅了许多介绍Node.js的文章,可惜对于Node.js的模块机制大都着墨不多.在后续介绍模块的使用之前,我认为有必要深入一下Node.js的模块机制. CommonJS规范 早在Netscape诞生不久后,JavaScript就一直在探索本地编程的路,Rhino是其代表产物.无奈那时服务端JavaScript走的路均是参考众多服务器端语言来实现的,在这样的背景之下,一没有特色,二没有实用价值.但是随着JavaScript在前端的应用越来越广泛,以及服务端J

Node.js入门:模块机制

CommonJS规范  早在Netscape诞生不久后,JavaScript就一直在探索本地编程的路,Rhino是其代表产物.无奈那时服务端JavaScript走的路均是参考众多服务器端语言来实现的,在这样的背景之下,一没有特色,二没有实用价值.但是随着JavaScript在前端的应用越来越广泛,以及服务端JavaScript的推动,JavaScript现有的规范十分薄弱,不利于JavaScript大规模的应用.那些以JavaScript为宿主语言的环境中,只有本身的基础原生对象和类型,更多的对

node模块机制

一.node模块化机制 1.commonJS模块规范包括三部分:模块引用.模块定义.模块标识.例如: //math.js exports.add = function(){    var sum = 0;    var args = arguments;    var len = args.length;    for(var i = 0;i < len;i++){        var num = args[i];        sum += num;    }    return sum;}

nodejs从0到1(Node简介+模块机制)

1.nodejs简介: 1.Node不是js应用,而是js运行平台.客户端js通过浏览器和v8引擎联系到了一起,服务器端js用Node和v8又牵起了小手,所以说Node是运行平台,类似于客户端的浏览器.Node采用c++语言编写,v8引擎也是c++写的.Node为神马用c++写呢?这是个有趣的故事,详见<深入浅出Nodejs>. 2.模块机制: 说模块机制之前,先说下CommonJS.CommonJS是一种规范.原来js规范比较薄弱,不利于js大规模应用:主要有以下的缺陷: 2.1:js没有模

Linux模块机制浅析

Linux模块机制浅析   Linux允许用户通过插入模块,实现干预内核的目的.一直以来,对linux的模块机制都不够清晰,因此本文对内核模块的加载机制进行简单地分析. 模块的Hello World! 我们通过创建一个简单的模块进行测试.首先是源文件main.c和Makefile. [email protected]:~/module$ cat main.c #include<linux/module.h> #include<linux/init.h> static int __i

Linux学习笔记之内核启动流程与模块机制

本文旨在简单的介绍一下Linux的启动流程与模块机制: Linux启动的C入口位于/Linux.2.6.22.6/init/main.c::start_kernel() 下图简要的描述了一下内核初始化的流程: 本文我们分析一下do_initcalls ()函数,他负责大部分模块的初始化(比如U盘驱动就是在这里被初始化的). 1 static void __init do_initcalls(void) 2 { 3 initcall_t *call; 4 int count = preempt_c

BIOS学习笔记之UEFI模块机制

本文旨在简单的介绍一下UEFI的模块机制: BIOS是固化在电脑主板上的一段程序,主要功能就是初始化主板,最后加载操作系统(OS):而UEFI通俗一点讲就是一种BIOS的规范,它提出了一种BIOS的实现架构并提供了一套开源的实现. 我们知道Linux的模块机制是通过宏来定义模块的入口点的(参考:Linux学习笔记之内核启动流程与模块机制),而UEFI的模块机制理解起来更容易,它的每个模块都有一个inf文件,里面描述了模块的详细信息,比如入口点(入口函数).模块包含哪些源文件等. 以U盘驱动为例:

Linux内核(6) - 模块机制与“Hello World!

有一种感动,叫内牛满面,有一种机制,叫模块机制.显然,这种模块机制给那些Linux的发烧友们带来了方便,因为模块机制意味着人们可以把庞大的Linux内核划分为许许多多个小的模块.对于编写设备驱动程序的开发者来说,从此以后他们可以编写设备驱动程序却不需要把她编译进内核,不用reboot机器,她只是一个模块,当你需要她的时候,你可以把她抱入怀中(insmod),当你不再需要她的时候,你可以把她一脚踢开(rmmod). 于是,忽如一夜春风来,内核处处是模块.让我们从一个伟大的例子去认识模块.这就是传说