深入理解nodejs 中 exports與module.exports

在Javascript 中,有2種作用域,分爲 全局作用域 ,和函數作用域,

在 瀏覽器端 , 全局作用域 就是 window對象的屬性,

函數作用域 就是 ,某個 函數 生成的對象的屬性;

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script>
        var name = 'html5';

        function Obj(){
            this.name = 'CSS3';
        }

        var obj = new Obj();
        console.log(obj);
        console.log(window.name);

    </script>
</head>
<body>

</body>
</html>

上面是代碼的運行結果,在使用this 的 時候,要特別注意,因爲this 是 在運行時 ,動態綁定某個對象,有諸多的不確定性,可能會產生意想不到的結果。


在nodejs 中,也有2 種作用域,分爲 全局作用域 ,和模塊作用域,我們一探究竟,將下面保存成test1.js,運行

var name = 'var-name';
name = 'name';


global.name='global-name';
this.name = 'module-name';

console.log(global.name);
console.log(this.name);
console.log(name);

我們看到 var name = 'var-name';name = 'name';  是定義的局部變量;

而 global.name='global-name'; 是爲 全局對象定義一個name 屬性,

而 this.name = 'module-name'; 是爲模塊對象定義了一個name 屬性


那麼我們來驗證一下,將下面保存成test2.js,運行

var t1 = require('./test1');
console.log(t1.name);
console.log(global.name);


從結果可以看出,我們成功導入 了test1 模塊,並運行了 test1的代碼,因爲在test2 中 輸出 了 global.name,

而 t1.name 則是 test1 模塊中通過 this.name 定義的,說明this 指向 的是 模塊作用域對象。


好吧,我們先來聊一下 CommonJS ,再來 接下來的猜想,

根據CommonJS規範,一個單獨的文件就是一個模塊。加載模塊使用require方法,該方法讀取一個文件並執行,最後返回文件內部的exports對象。


那麼我們來看看在node模塊中 exports、module.exports、this

console.log(module.exports === this);
console.log(module.exports === exports);
console.log(this === exports);


從上面代碼執行結果可以看出, 他們都指向同一個對象,

那到底有什麼區別,爲什麼要這麼設計,有什麼好處,

我們以後來分析,請繼續關注。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章