nodejs編譯js文件時對js文件的包裝
nodejs在編譯js文件時會對獲取的js文件內容進行頭尾包裝 (function(exports,require,module,__filename,__dirname){\n 和 \}),正常的js文件就變成了:
(function(exports,require,module,__filename,__dirname){
var a=function(){};
..............
})
包裝后我們在每一個js文件中都會有變量exports,require,module同時包裝后防止了全局污染
exports和module.exports的區別是什么呢?
對js文件內容進行包裝后返回一個函數,在函數執行時傳遞的參數中 exports和module.exports指向的是同一個變量可以通過下面的方式得到驗證:
將下面的代碼保存到 nodejsbuild.js文件
console.log(arguments)
console.log(exports==exports)
運行 node nodejsbuild.js
初始時傳入的exports和model.exports是相等的 當我們對exports進行賦值操作或models.exports進行賦值操作時,兩者相等的關系會被破壞 ,而最后使用的其實是model.exports. 當時用的時候發現出現了問題
通過上面的如可以很明顯的知道到底發生了什么,左后為什么和預期的結果不一樣了。當我們對exports或model.exports進行賦值后為保證一致性需要進行賦值操作否則最后使用時有可能和預期不一樣。
上面是很常見的對一個變量進行賦值后導致引用的對象變了最后程序運行的結果和預期不一致的問題