es6 --- 模塊

function foo(){var something = 'cool';var another = [1, 2, 3];function doSomething() {console.log( something );}function doAnother() {console.log( another.join( " ! " ) );}
}
// 是一個不明顯的閉包,doSomething()和doAnother()保持了foo的內部作用域

接下來考慮以下的代碼:

function CoolModule() {var something = "cool";var another = [1, 2, 3];function doSomething() {console.log( something );}function doAnother() {console.log( another.join( " ! " ) );}return {doSomething: doSomething,doAnother: doAnother};
}var foo = CoolModule();foo.doSomething(); // "cool"
foo.doAnthor(); // 1!2!3
// 上述通過 return 將doSomething和doAnother暴露出來,在js中被稱為模塊.

從上面可以抽象出模塊模式所必須的兩個必要條件:
1.必須有外部的封閉函數,該函數必須至少被調用一次(每次調用都會創建一個新的模塊實例)
2.封閉函數必須返回至少一個內部函數,這樣內部函數才能在私有作用域中形成閉包,并且可以訪問或者修改私有的狀態.

下面看一個單例模式:

var foo = (function CoolModule() {var something = 'cool';var another = [1, 2, 3,];function doSomething() {console.log( something );}function doAnother() {console.log( another.join( " ! " ) );}return {doSomething: doSomething,doAnother: doAnother}
})();
foo.doSomething(); // cool
foo.doAnother(); // 1!2!3// 注:上述的CoolModule在執行一次后便釋放掉了.

接受參數的模塊:

functioin CoolModule(id) {function identify() {console.log( id );}return {identify: identify}
}var foo1 = CoolModule( "foo 1" );
var foo2 = CoolModule( "foo 2" );
foo1.identify(); // "foo 1"
foo2.identify(); // "foo 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};
})();// 上述定義了一個模塊依賴加載器/管理器,下面使用上述的函數來定義模塊
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: hippofoo.awesome(); // LET ME INTRODUCE: HIPPO

ES6中的模塊

// bar.js
function hello(who) {return "Let me introduce: " + who;
}
export hello;// foo.js
import hello from "bar";var hungry = "hippo";function awesome() {console.log(hello( hungry ).toUpperCase());
}
export awesome;// baz.js
import foo from "foo";  // 書上是module foo from "foo"
import bar from "bar";console.log(bar.hellow( "rhino" )
);    // Let me introduce: rhinofoo.awesome();  // LET ME INTRODUCE: HIPPO

ES6模塊和CommonJS模塊的差異:
https://blog.csdn.net/piano9425/article/details/89946163

參考《你不知道的JavaScript》(上卷)P53~P56

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251243.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251243.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251243.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java之遞歸遍歷目錄,修改指定文件的指定內容

EditProperties.java 1 package PropertiesOperation.Edit;2 3 import java.io.File;4 5 /**6 * 替換指定Porpoerties文件中的指定內容7 * 三個參數&#xff1a;8 * filePath&#xff1a;存放properties文件的目錄9 * srcStr&#xff1a;需要替換的字符串 10 * desStr&…

學習日志---7

1.復習Linux hadoop hdfs MapReduce基礎知識 1&#xff0c;列舉linux常用命令 shutdown now reboot mkdir mkdir -p touch filename rm -r filename rm -rf filename vi filename i--->可編輯狀態 esc --> : --->wq 保存退出 q! wq! cat grep find ifconfig ping user…

javascript --- 屬性描述符

從ES5開始,所有的屬性都具備了屬性描述符 var myObject {a: 2 };Object.getOwnPropertyDescriptor(myObject, "a"); //{ // value:2, // writable: true, // 可寫 // enumerable: true, // 可枚舉 // configurble: true // 可配置 //}定義屬性…

看了嗎網址鏈接

sklearn實戰-乳腺癌細胞數據挖掘&#xff08;博主親自錄制視頻&#xff09; https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare # -*- coding: utf-8 -*- ""&qu…

JMeter 性能測試進階實戰

課程簡介 本課程制作的主要目的是為了讓大家快速上手 JMeter&#xff0c;期間穿插了大量主流項目中用到的技術&#xff0c;以及結合當今主流微服務技術提供了測試 Dubbo 接口、Java 工程技術具體實施方案&#xff0c;注重實踐、注意引導測試思維、拒絕枯燥的知識點羅列、善于用…

javascript --- 混入

顯示混入: function mixin(sourceObj, targetObj){for(var key in sourceObj){ // 遍歷source中的所有屬性if(!(key in targetObj)) { // 找到targetz中沒有的屬性targetObj[key] sourceObj[key];}}return targetObj; }var Vehicle {engines: 1,iginition: function() {c…

php源碼代目錄

ext :存放動態和內建模塊的目錄&#xff0c;在這里可以找到所有的php官方虧站,并且也可以在這里編寫擴展&#xff1b; main:包含php的主要宏定義; pear: PHP擴展與應用庫; sapi:包含不同服務器抽象層的代碼; TSRM&#xff1a;Zend和PHP的"線程安全資源管理器"目錄; Z…

bzoj1231 [Usaco2008 Nov]mixup2 混亂的奶牛——狀壓DP

題目&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id1231 小型狀壓DP&#xff1b; f[i][j] 表示狀態為 j &#xff0c;最后一個奶牛是 i 的方案數&#xff1b; 所以下一個只能是和它相差大于 k 而且不在狀態中的奶牛。 代碼如下&#xff1a; #include<iostr…

JavaScript高級程序設計閱讀筆記

2020-11-15 通過初始化指定變量類型 數字-1 對象null和null的比較&#xff08;不理解&#xff09;使用局部變量將屬性查找替換為值查找&#xff08;算法復雜度&#xff09;循環的減值迭代&#xff0c;降低了計算終止條件的復雜度switch快多個變量聲明逗號隔開使用數組和對象字面…

jquery --- 監聽input框失效

使用juery監聽Input輸入的變化,并且封裝起來,如下: // html <input type"text" id‘myinput1’ /> // js function formOnById(id){let dom # id;$(dom).bind(input propertychange,()>{let item $(dom).val;console.log(item);} } formOnById(myinp…

windows任務計劃程序 坑

轉載于:https://www.cnblogs.com/kaibindirver/p/8109041.html

第三篇:函數之嵌套

1 #函數的嵌套調用&#xff1a;在調用一個函數的時&#xff0c;其內部的代碼又調用其他的函數2 # def bar():3 # print(from bar)4 #5 # def foo():6 # print(from foo)7 # bar()8 #9 # foo() 10 11 12 # def max2(x,y): 13 # if x > y: 14 # ret…

vue路由權限(結合服務端koa2)

gitee地址 一、項目初始化 vue create manager-admin // 創建vue項目// 管理員權限安裝 cnpm i -S koa2 // 下載koa2依賴 cnpm install --global koa-generator // 下載框架 koa-generator koa2 manager-server // 創建項目 cd manager-server // 進入項目 npm install // 安…

javascript --- 類、class、事件委托的編程風格

類風格: // 父類 function Widget(width, height) {this.width width || 50;this.height height || 50;this.$elem null; } Widget.prototype.render function($where) {if(this.$elem) {this.$elem.css({width: this.width "px",height: this.height "p…

在線獲取UUID

http://fir.im/udid轉載于:https://www.cnblogs.com/mtjbz/p/8116576.html

堆和堆排序

堆和優先隊列 普通隊列&#xff1a;FIFO&#xff0c;LILO 優先隊列&#xff1a;出隊順序和入隊順序無關&#xff0c;和優先級相關。一個典型應用就是操作系統中。動態選擇優先級高的任務執行 堆的實現 最典型的堆就是二叉堆&#xff0c;就像是一顆二叉樹。這個堆的特點&#xf…

ES5-1 發展史、ECMA、編程語言、變量、JS值

1. 5大主流瀏覽器及內核&#xff08;自主研發&#xff09; 瀏覽器內核IEtridentChromewebkit blinkSafariwebkitFirefoxgeckoOperapresto 2. 瀏覽器的歷史 和 JS誕生 1989-1991 WorldWideWeb&#xff08;后來為了避免與萬維網混淆而改名為Nexus&#xff09;是世界上第一個網頁…

javascript --- 使用對象關聯簡化整體設計

在某個場景中,我們有兩個控制器對象: 1.用來操作網頁中的登錄表單; 2.用來與服務器進行通信. 類設計模式 // 把基礎的函數定義在名為Controller的類中,然后派生兩個子類LoginController和AuthController. // 父類 function Controller() {this.errors []; } Controller.prot…

javascript --- polyfill中幾個常用方法

ES6中,新增了許多有用的方法,下面分享幾個ES6之前得版本寫的polyfill Number.EPSILON: // 機器精度,并判斷2個數是否相等 if(!Number.EPSILON){Number.EPSILON math.pow(2, -52); }function numberCloseEnoughToEqual(n1, n2) {return Math.abs(n1 - n2 ) < Number.EPSIL…

[Usaco2010 Nov]Visiting Cows

題目描述 經過了幾周的辛苦工作,貝茜終于迎來了一個假期.作為奶牛群中最會社交的牛,她希望去拜訪N(1<N<50000)個朋友.這些朋友被標號為1..N.這些奶牛有一個不同尋常的交通系統,里面有N-1條路,每條路連接了一對編號為C1和C2的奶牛(1 < C1 < N; 1 < C2 < N; C1…