何謂module
ES5 (ECMAScript 5) 時,JavaScript本身並沒有內建module的概念. module一般可視做Function及資料(object)的集合. 且通常是散布在多個檔案裡.
一個Project中使用多個JavaScript檔案
通常是
- 自己的一個JS檔案 + 引入別人寫好的JS檔案
- 自己的就拆成多個檔案, 這樣可以避免一個檔案過大
Browser端:
可由<script>
來引入JS檔案, 下面的例子中, B.js因為是後引入的, 所以可以讀到A.js裡的global變數, 且B.js定義的global function會蓋過A.js同名字的,就等同於兩個JS檔案拼在一起.
<script src="A.js"></script>
<script src="B.js"></script>
Node.js端:
需使用Node.js自己實作的CommonJS module方式(require/exports
)
examples: 待補充
Browser端可以使用像是webpack等打包JS工具
webpack有幾種功能
- 把多個JS檔案合成一個, 這樣
<script>
使用一個就好 - 同時把JS檔案minified混淆打亂過, 使別人無法輕易看到完整source code
- 可使用Node.js的CommonJS的寫法(require等)來讓A file引用B file的東西.
ES6的module (import/export)
不管是Browser端以及Node.js端, 都沒有內建支援ES6的原生module語法. 但可以使用Babel等JS compiler工具來使用
語法參考:
https://github.com/lukehoban/es6features/blob/master/README.md#modules
timeout
setTimeout(function(){ console.log("timeout"); }, 3000);
timer的用法跟陷阱
// closure problem
for(var i=0; i<10;i++){
setInterval(function(){
console.log(i); // 10, 10, ...., 10 !!!
}, 5000);
}
How to fix it ??
1. use ES6的blocked scope keywoard, let
2. use another function to forcely pass by value (i)