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 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 作为一个模块,实际都是用一个函数封装起来的,具体参考 你需要了解的 Node.js 模块
补充:我把你的问题理解错了。全局变量的意义就在于“全局”,Node 有这个,C/C++ 也有,即使 Java、C# 也可以通过静态成员来实现“全局”。全局本身不是问题,问题是你真的需要全局吗?
回答2:每个js文件有独立的module,仔细看过node官网的module部分就能知道,每个模块也就是文件都有自己的全局变量module,从而能通过module.exports进行模块导出,每个文件的内容都存在一个闭包中,所以说,所谓的单独上下文其实是有的,看你怎么定义这个单独上下文,如果没有的话,CommonJS的module机制就不存在了。
回答3:问题其实有点下套,其实Node有给每个js文件独立的上下文,但是这避免不了全局的作用域污染,实际上这是为了功能的妥协。
当然,可以用上严格模式来避免一时的粗心导致的全局污染。
回答4:完了 看来 这个问题没人回答啊 自己顶一下
在知乎上找到了一个差不多能回答这个问题的答案,感觉差不多
https://www.zhihu.com/questio...
回答5:module 不就是上下本?
相关文章:
1. 在windows下安装docker Toolbox 启动Docker Quickstart Terminal 失败!2. 计算机 - 我学习了C语言,数据结构和一点点java基础,想自学C++,请问买什么入门书籍好?3. docker-compose 为何找不到配置文件?4. 我在centos容器里安装docker,也就是在容器里安装容器,报错了?5. docker 下面创建的IMAGE 他们的 ID 一样?这个是怎么回事????6. 前端 - css中关于设置透明度的问题,有点混乱7. docker - 如何修改运行中容器的配置8. dockerfile - 我用docker build的时候出现下边问题 麻烦帮我看一下9. docker绑定了nginx端口 外部访问不到10. docker start -a dockername 老是卡住,什么情况?
