javascript - 為什么 Node.js 不給每一個.js文件以獨立的上下文來避免作用域被污染?
問題描述
在cnode論壇看到這樣一個問題:
目前的 Node.js 將 VM 的接口暴露了出來, 可以讓你自己創(chuàng)建一個新的 js 上下文, 這一點上跟前端 js 還是區(qū)別挺大的. 在執(zhí)行外部代碼的時候, 通過創(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);
既然可以通過新的上下文來避免污染, 那么為什么 Node.js 不給每一個.js文件以獨立的上下文來避免作用域被污染?
實在是在下學藝不精首先就沒弄明白他問的啥,其次是這個問題怎么解決;萬望大家不吝賜教,感激不盡,跪謝引用自:https://github.com/ElemeFE/no...
問題解答
回答1:誰說 Node 沒給每個 js 文件獨立的上下文了……Node 的每個 .js 作為一個模塊,實際都是用一個函數(shù)封裝起來的,具體參考 你需要了解的 Node.js 模塊
補充:我把你的問題理解錯了。全局變量的意義就在于“全局”,Node 有這個,C/C++ 也有,即使 Java、C# 也可以通過靜態(tài)成員來實現(xiàn)“全局”。全局本身不是問題,問題是你真的需要全局嗎?
回答2:每個js文件有獨立的module,仔細看過node官網(wǎng)的module部分就能知道,每個模塊也就是文件都有自己的全局變量module,從而能通過module.exports進行模塊導出,每個文件的內容都存在一個閉包中,所以說,所謂的單獨上下文其實是有的,看你怎么定義這個單獨上下文,如果沒有的話,CommonJS的module機制就不存在了。
回答3:問題其實有點下套,其實Node有給每個js文件獨立的上下文,但是這避免不了全局的作用域污染,實際上這是為了功能的妥協(xié)。
當然,可以用上嚴格模式來避免一時的粗心導致的全局污染。
回答4:完了 看來 這個問題沒人回答啊 自己頂一下
在知乎上找到了一個差不多能回答這個問題的答案,感覺差不多
https://www.zhihu.com/questio...
回答5:module 不就是上下本?
相關文章:
1. Docker for Mac 創(chuàng)建的dnsmasq容器連不上/不工作的問題2. javascript - QWebEngineView 如何爬 angular 的動態(tài)數(shù)據(jù)?3. javascript - 使用angular 的ui-sref 中出現(xiàn)了中文參數(shù),點擊跳轉后瀏覽器的地址欄里出現(xiàn)轉義后的%AE....%a%44. java - 一段遞歸代碼的問題5. java - instance method中 static后的<K>是什么意思?6. html5 - 這個代碼顯示功能如何實現(xiàn)?7. javascript - 用JS 七牛上傳圖片出現(xiàn)文件已存在的錯誤(file exists)8. java - springboot新手學習9. css3 - 圖片等比例縮放10. java - com.android.internal.R.attr.dialogTheme 這個dialogTheme的內容再哪里查看?
