在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);
从上面代码执行结果可以看出, 他们都指向同一个对象,
那到底有什么区别,为什么要这么设计,有什么好处,
我们以后来分析,请继续关注。。。