javascript - 為什么 Node.js 不給每一個(gè).js文件以獨(dú)立的上下文來(lái)避免作用域被污染?
問(wèn)題描述
在cnode論壇看到這樣一個(gè)問(wèn)題:
目前的 Node.js 將 VM 的接口暴露了出來(lái), 可以讓你自己創(chuàng)建一個(gè)新的 js 上下文, 這一點(diǎn)上跟前端 js 還是區(qū)別挺大的. 在執(zhí)行外部代碼的時(shí)候, 通過(guò)創(chuàng)建新的上下文沙盒 (sandbox) 可以避免上下文被污染:
’use strict’;const vm = require(’vm’);let code =`(function(require) { const http = require(’http’); http.createServer( (request, response) => { response.writeHead(200, {’Content-Type’: ’text/plain’}); response.end(’Hello Worldn’); }).listen(8124); console.log(’Server running at http://127.0.0.1:8124/’);})`;vm.runInThisContext(code)(require);
既然可以通過(guò)新的上下文來(lái)避免污染, 那么為什么 Node.js 不給每一個(gè).js文件以獨(dú)立的上下文來(lái)避免作用域被污染?
實(shí)在是在下學(xué)藝不精首先就沒(méi)弄明白他問(wèn)的啥,其次是這個(gè)問(wèn)題怎么解決;萬(wàn)望大家不吝賜教,感激不盡,跪謝引用自:https://github.com/ElemeFE/no...
問(wèn)題解答
回答1:誰(shuí)說(shuō) Node 沒(méi)給每個(gè) js 文件獨(dú)立的上下文了……Node 的每個(gè) .js 作為一個(gè)模塊,實(shí)際都是用一個(gè)函數(shù)封裝起來(lái)的,具體參考 你需要了解的 Node.js 模塊
補(bǔ)充:我把你的問(wèn)題理解錯(cuò)了。全局變量的意義就在于“全局”,Node 有這個(gè),C/C++ 也有,即使 Java、C# 也可以通過(guò)靜態(tài)成員來(lái)實(shí)現(xiàn)“全局”。全局本身不是問(wèn)題,問(wèn)題是你真的需要全局嗎?
回答2:每個(gè)js文件有獨(dú)立的module,仔細(xì)看過(guò)node官網(wǎng)的module部分就能知道,每個(gè)模塊也就是文件都有自己的全局變量module,從而能通過(guò)module.exports進(jìn)行模塊導(dǎo)出,每個(gè)文件的內(nèi)容都存在一個(gè)閉包中,所以說(shuō),所謂的單獨(dú)上下文其實(shí)是有的,看你怎么定義這個(gè)單獨(dú)上下文,如果沒(méi)有的話,CommonJS的module機(jī)制就不存在了。
回答3:問(wèn)題其實(shí)有點(diǎn)下套,其實(shí)Node有給每個(gè)js文件獨(dú)立的上下文,但是這避免不了全局的作用域污染,實(shí)際上這是為了功能的妥協(xié)。
當(dāng)然,可以用上嚴(yán)格模式來(lái)避免一時(shí)的粗心導(dǎo)致的全局污染。
回答4:完了 看來(lái) 這個(gè)問(wèn)題沒(méi)人回答啊 自己頂一下
在知乎上找到了一個(gè)差不多能回答這個(gè)問(wèn)題的答案,感覺(jué)差不多
https://www.zhihu.com/questio...
回答5:module 不就是上下本?
相關(guān)文章:
1. python - linux怎么在每天的凌晨2點(diǎn)執(zhí)行一次這個(gè)log.py文件2. 關(guān)于mysql聯(lián)合查詢一對(duì)多的顯示結(jié)果問(wèn)題3. 實(shí)現(xiàn)bing搜索工具urlAPI提交4. MySQL主鍵沖突時(shí)的更新操作和替換操作在功能上有什么差別(如圖)5. 數(shù)據(jù)庫(kù) - Mysql的存儲(chǔ)過(guò)程真的是個(gè)坑!求助下面的存儲(chǔ)過(guò)程哪里錯(cuò)啦,實(shí)在是找不到哪里的問(wèn)題了。6. windows誤人子弟啊7. 冒昧問(wèn)一下,我這php代碼哪里出錯(cuò)了???8. 如何用筆記本上的apache做微信開(kāi)發(fā)的服務(wù)器9. 我在網(wǎng)址中輸入localhost/abc.php顯示的是not found是為什么呢?10. mysql優(yōu)化 - MySQL如何為配置表建立索引?
