在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);
從上面代碼執行結果可以看出, 他們都指向同一個對象,
那到底有什麼區別,爲什麼要這麼設計,有什麼好處,
我們以後來分析,請繼續關注。。。