Table of Contents
1 全局對象
- global
console.log(global); // Object [global] { // global: [Circular], // clearInterval: [Function: clearInterval], // clearTimeout: [Function: clearTimeout], // setInterval: [Function: setInterval], // setTimeout: [Function: setTimeout] { [Symbol(util.promisify.custom)]: [Function] }, // queueMicrotask: [Function: queueMicrotask], // clearImmediate: [Function: clearImmediate], // setImmediate: [Function: setImmediate] { // [Symbol(util.promisify.custom)]: [Function] // } // }
- console
console.log(console) // { // log: [Function: bound consoleCall], // warn: [Function: bound consoleCall], // dir: [Function: bound consoleCall], // time: [Function: bound consoleCall], // timeEnd: [Function: bound consoleCall], // timeLog: [Function: bound consoleCall], // trace: [Function: bound consoleCall], // assert: [Function: bound consoleCall], // clear: [Function: bound consoleCall], // count: [Function: bound consoleCall], // countReset: [Function: bound consoleCall], // group: [Function: bound consoleCall], // groupEnd: [Function: bound consoleCall], // table: [Function: bound consoleCall], // debug: [Function: bound consoleCall], // info: [Function: bound consoleCall], // dirxml: [Function: bound consoleCall], // error: [Function: bound consoleCall], // groupCollapsed: [Function: bound consoleCall], // Console: [Function: Console], // profile: [Function: profile], // profileEnd: [Function: profileEnd], // timeStamp: [Function: timeStamp], // context: [Function: context], // [Symbol(kBindStreamsEager)]: [Function: bound ], // [Symbol(kBindStreamsLazy)]: [Function: bound ], // [Symbol(kBindProperties)]: [Function: bound ], // [Symbol(kWriteToConsole)]: [Function: bound ], // [Symbol(kGetInspectOptions)]: [Function: bound ], // [Symbol(kFormatForStdout)]: [Function: bound ], // [Symbol(kFormatForStderr)]: [Function: bound ] // }
- exports, require, module, _filename, _dirname(模塊參數)
console.log(arguments.callee + ''); // function (exports, require, module, __filename, __dirname) { // console.log(arguments.callee + '');
2 代碼執行優先級
同步代碼優先,例子以下css
// 代碼執行優先級 setTimeout(function () { setTimeout(function () { console.log('time out'); }, 0); new Promise(resolve => { setTimeout(function () { console.log('start in Promise'); }, 1); console.log('beg'); resolve(); console.log('end'); setTimeout(function () { console.log('end in Promise'); }, 0); }).then(() => { console.log('finish'); }); console.log('不要調皮'); }, 100); // beg // end // 不要調皮 // finish // time out // start in Promise // end in Promise
3 模塊導入
同步導入,module.exports =
exports ==> truehtml
{ test } » tree
.
├── index.js
└── test.js
- ./index.js
console.log("index.js");
- ./test.js
require('./index.js'); console.log('test.js');
output: 導入以後纔會繼續執行代碼java
index.js test.js
4 模塊加載
4.1 文件模塊優先級
這裏只考慮 .js .json文件路徑加載node
- 文件結構
. ├── a.js ├── a.json ├── b.json └── test.js
- a.js
module.exports = "js文件優先";
- a.json
{ "s": "json文件優先" }
- b.json
{ "main" : "json 文件也支持省略擴展名的方式加載" }
- test.js
// 測試js文件先加載 console.log(require('./a')); // 證實json也能夠加載 console.log(require('./b'));
- output
- 默認文件加載js先於json文件
js文件優先
{ main: 'json 文件也支持省略擴展名的方式加載' }
4.2 文件夾加載優先級
4.2.1 包(文件夾)下的入口文件優先級
- 文件結構
. ├── a │ ├── index.js │ ├── m.js │ └── package.json ├── b │ ├── index.js │ └── package.json ├── c │ └── index.js └── test.js
- ./a
- index.js
module.exports = "index.js文件優先";
- m.js
module.exports = "package.json文件優先";
- package.json
{ "name": "a", "version": "1.0.0", "main" : "m.js" }
- ./b
- index.js
module.exports = "./b/index.js文件優先";
- package.json
{ "name": "a", "version": "1.0.0" }
- ./c
- index.js
module.exports = "index.js支持默認加載";
- ./test.js
// 優先加載packagae.json文件 console.log(require('./a')); // packagae.json中main屬性指定加載某文件 console.log(require('./b')); // index.js也支持默認加載 console.log(require('./c'));
- output
package.json文件中有main優先於index.js文件 python
package.json文件優先 ./b/index.js文件優先 index.js支持默認加載
4.2.2 包加載優先級
- 路徑加載
- 文件結構
. ├── fs │ └── index.js └── test.js
- ./fs/index.js
module.exports = "路徑加載優先級高";
- ./fs/test.js
// 加載核心模塊 console.log(require('fs')); // 第三方模塊 console.log(require('./fs'));
- output
路徑加載優先級高於核心模塊sql
{ appendFile: [Function: appendFile], appendFileSync: [Function: appendFileSync], access: [Function: access], accessSync: [Function: accessSync], chown: [Function: chown], promises: [Getter] ..........//還有不少 } 路徑加載優先級高
- 非路徑加載
- 文件結構
. ├── node_modules │ ├── fs │ │ └── index.js │ └── tts │ └── index.js └── test.js
- ./node nodules./fs/index.js
module.exports = "./node_nodules./fs";
- ./node nodules./tts/index.js
module.exports = "./node_nodules./tts";
- ./test.js
// 判斷第三方模塊和核心模塊的優先級 console.log(require('fs')); // 第三方模塊能夠加載 console.log(require('tts'));
- output
- 核心模塊加載優先於第三方模塊(node modules)
{ appendFile: [Function: appendFile], appendFileSync: [Function: appendFileSync], access: [Function: access], ......//不少 promises: [Getter] } ./node_nodules./tts
- 第三方模塊查找過程(非路徑查找)
- 文件結構
. ├── a │ ├── b │ │ ├── c │ │ │ ├── node_modules │ │ │ │ └── tts1 │ │ │ │ └── index.js │ │ │ └── t.js │ │ └── node_modules │ │ └── tts2 │ │ └── index.js │ └── node_modules │ └── tts3 │ └── index.js └── node_modules └── tts4 └── index.js
- module.paths 中列表的順序查找
- 遞歸向上級目錄查找
[ 'C:\\a\\b\\c\\node_modules', 'C:\\a\\b\\node_modules', 'C:\\a\\node_modules', 'C:\\node_modules' ]
5 核心模塊的簡單使用
5.1 events
繼承了事件類,自身不用實現事件類shell
const events = require('events'); class Teacher extends events { constructor(sec = 2000) { super(); this.sec = sec; this.doing(); } doing() { let cnt = 0; setInterval(() => { ++cnt; this.emit('class', {cnt}); }, this.sec); } } const t = new Teacher(); t.on('class', function (args) { console.log('time to class:', args.cnt); });