首页 > 代码库 > 深入理解nodejs 中 exports与module.exports

深入理解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);


从上面代码执行结果可以看出, 他们都指向同一个对象,

那到底有什么区别,为什么要这么设计,有什么好处,

我们以后来分析,请继续关注。。。