node系列之globals

地址

傳送門

說明

這里的全部對象,是指在任意地方都可以直接使用,無需require(module)。這里的對象,主要是定時方法,以及nodejs進(jìn)行模塊化時封裝的一些參數(shù),可直接使用。雖然稱之為全局對象,但很多都是本地對象來的。比如,__dirname, __filename, module, exports等等,都是本地的對象,只是看起來像是一個全局的。我們可以暫且稱之為本地全局對象。

module isn't actually a global but rather local to each module.

定時方法

  • setImmediate(callback[, ...args])
  • setInterval(callback, delay[, ...args])
  • setTimeout(callback, delay[, ...args])
    暫時還不是很懂。感覺這三個方法有毒,不能捉摸它們的執(zhí)行順序??赡苁俏疫€太年輕,沒有完全理清楚事件循環(huán)。反正目前來說,它們就是一個定時器的存在。這些方法會返回一個句柄,供調(diào)用方使用(清理)

清理定時器的方法

  • clearImmediate(immediateObject)
  • clearInterval(intervalObject)
  • clearTimeout(timeoutObject)
    依次對應(yīng)上面這些定時器

每個js文件里面必有的對象

(function (exports, require, module, __filename, __dirname) {  
  // 模塊源碼
})();

大概是這樣的一種形式,nodejs會封裝起來形成模塊,所以上面說的,這些其實算是本地變量了,畢竟,每個這樣的對象,在不同的文件中,都是不一樣的。

  • __dirname: 當(dāng)前文件所在的目錄
  • __filename: 當(dāng)前完整文件名,包括具體的目錄,如 /var/www/app.js
  • module: 當(dāng)前模塊的引用。module.exports聲明對外可見的對象或方法,表示被require的值。詳細(xì)見于module模塊(此模塊大有來頭,這里沒有辦法一下子說明白。下次補(bǔ)充)
    exports: module.exports的引用

require

  • require.cache 加載的模塊會在這里緩存著。
console.log(require.cache);
// output: 
{ '/koala/hello-world/test.js':
   Module {
     id: '.',
     exports: {},
     parent: null,
     filename: '/koala/hello-world/test.js',
     loaded: false,
     children: [],
     paths:
      [ '/koala/hello-world/node_modules',
        '/koala/node_modules',
        '/node_modules' ] } }

由此可見,require.cache是一個object,key 是模塊所在的文件地址,value是該模塊的詳細(xì)信息,也就是module.exports的哪一塊信息,除此之外,還有children,parent等信息。

  • require.extensions 貌似已經(jīng)被棄用了,不想寫太多。

  • require.resolve 返回該模塊的地址(文件名)。

console.log(require.resolve('./test'));
// output:  /koala/hello-world/test.js

需要注意的地方

  • require.cache 這雖然是一個存儲模塊緩存的地方,當(dāng)時,只是一個引用而已。所以,假如清理所有的緩存,不能簡單粗暴地設(shè)置 require.cache = {}, 因為這樣只是改了引用,而實際的緩存并沒有清走。這類似于C語言的指針。所以,想要清除緩存,必須一個一個地清理。
Object.keys(require.cache, (item) => {
   delete require.cache[item];
})

這樣才能清除。

類似這樣的,還有module.exportsexports的關(guān)系。真正對外開發(fā)的是前者,后者只是對前者的一個引用而已。

child.js
module.exports = {    
  func: () => {        
       console.log('func')   
   }
};
exports = {};

parent.js
var child = require('./child');
child.func();
// output :  func

跟上面是同一個意思的。需要留意的是,你所使用的變量,究竟是一個別名(引用),還是一個真實存儲數(shù)據(jù)的地方(這里說得有點亂,有點不對,但是能理解就好)

小結(jié)

內(nèi)容有點空洞,沒啥好說的哇

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容