首頁  >  問答  >  主體

javascript - 為什麼 Node.js 不給每一個.js檔案以獨立的上下文來避免作用域被污染?

在cnode論壇看到這樣一個問題:

目前的Node.js 將VM 的介面暴露了出來, 可以讓你自己創建一個新的js 上下文, 這一點上跟前端js 還是區別挺大的. 在執行外部程式碼的時候, 通過創建新的上下文沙盒(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 World\n');
  }).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...

PHP中文网PHP中文网2713 天前1595

全部回覆(5)我來回復

  • 高洛峰

    高洛峰2017-05-16 13:47:41

    誰說 Node 沒給每個 js 檔案獨立的上下文了…Node 的每個 .js 作為一個模組,實際上都是用一個函數封裝起來的,具體參考 你需要了解的 Node.js 模組

    補充:我把你的問題理解錯了。全域變數的意義就在於“全域”,Node 有這個,C/C++ 也有,即使 Java、C# 也可以透過靜態成員來實現“全域”。全局本身不是問題,問題是你真的需要全局嗎?

    回覆
    0
  • PHP中文网

    PHP中文网2017-05-16 13:47:41

    每個js文件有独立的module,仔细看过node官网的module部分就能知道,每个模块也就是文件都有自己的全局变量module,从而能通过module.exports进行模块导出,每个文件的内容都存在一个闭包中,所以说,所谓的单独上下文其实是有的,看你怎么定义这个单独上下文,如果没有的话,CommonJSmodule機制就不存在了。

    回覆
    0
  • 世界只因有你

    世界只因有你2017-05-16 13:47:41

    問題其實有點下套,其實Node有給每個js檔案獨立的上下文,但這避免不了全域的作用域污染,其實這是為了功能的妥協。

    當然,可以用嚴格模式來避免一時的粗心所導致的全局污染。

    回覆
    0
  • PHP中文网

    PHP中文网2017-05-16 13:47:41

    完了 看來 這個問題沒人回答啊 自己頂一下

    在知乎上找到了一個差不多能回答這個問題的答案,感覺差不多

    https://www.zhihu.com/questio...

    回覆
    0
  • 怪我咯

    怪我咯2017-05-16 13:47:41

    module 不就是上下本?

    回覆
    0
  • 取消回覆