Javascript 为什么在nodejs REPL中运行函数Array(){}会破坏nodejs
几分钟前,我提出了一个想法,在用户的脚本范围内重新定义内置的Javascript 为什么在nodejs REPL中运行函数Array(){}会破坏nodejs,javascript,node.js,Javascript,Node.js,几分钟前,我提出了一个想法,在用户的脚本范围内重新定义内置的数组构造函数,如: function Array () {} 在Chrome开发工具中,它覆盖了全局范围的内置数组,但没有修改Chrome的js范围(这意味着Chrome本身的js代码工作正常),正如我所预料的那样 然而,当我在Node.js中执行一个测试时,我得到了很多信息(更具体地说,每勾一个): 它一直在输出,Node.js对我的输入没有响应,所以我必须杀死它。 我执行了进一步的测试,例如函数对象(){}和函数号(){},这两个
数组构造函数,如:
function Array () {}
在Chrome开发工具中,它覆盖了全局范围的内置数组
,但没有修改Chrome的js范围(这意味着Chrome本身的js代码工作正常),正如我所预料的那样
然而,当我在Node.js中执行一个测试时,我得到了很多信息(更具体地说,每勾一个):
它一直在输出,Node.js对我的输入没有响应,所以我必须杀死它。
我执行了进一步的测试,例如函数对象(){}
和函数号(){}
,这两个测试都导致Node.js强制退出:
internal/util/inspect.js:292
const descriptor = Object.getOwnPropertyDescriptor(obj, 'constructor');
^
TypeError: Object.getOwnPropertyDescriptor is not a function
at getConstructorName (internal/util/inspect.js:292:31)
at formatRaw (internal/util/inspect.js:477:23)
... (other stacks)
at Domain._errorHandler (domain.js:224:23)
at Object.setUncaughtExceptionCaptureCallback (domain.js:140:29)
at process._fatalException (internal/bootstrap/node.js:490:31)
及
internal/async\u hooks.js:121
如果(!Number.isSafeInteger(asyncId)| | asyncId<-1){
^
TypeError:Number.isSafeInteger不是函数
在validateAsyncId(内部/async_hooks.js:121:15)
在emitInitScript(internal/async_hooks.js:317:3)
...
在WriteStream.Socket.\u write(net.js:725:8)
在doWrite(_stream_writable.js:410:12)
(在Node.js REPL中执行函数字符串(){}
一开始是可以的,但是进一步键入并移动光标会导致它退出)
我知道在Node.js的脚本文件运行模式下,内容将用(函数(导出、要求、模块、文件名、目录名){
包装,因此当前范围内的修改不会干扰Node.js的“内部脚本”范围
那么为什么修改对象
和数组
等会导致Node.js REPL意外退出呢?这对我来说毫无意义
我在macOS上使用Node.js 10.12.0,nvm作为版本管理器
也在Node.js 8.9.4上进行了测试,得到了类似的结果
希望有人能帮忙!花了几个小时在网上搜索
我在nodejs/help
repo中发现:
在全局作用域中使用var
创建变量将创建(覆盖)具有相同名称的全局对象的属性。因此var Date=3
相当于global.Date=3
,但Node.js REPL脚本使用Date
在REPL中安全执行脚本的唯一方法是在单独的领域中运行它们,而Node.js目前没有这样做。否则,用户脚本可能会覆盖任何有用的全局属性
中断REPL并不难。例如,String.prototype.replace=null
也会终止进程
因此,这似乎与我的问题有关,在仔细调查Node.js源代码后,我发现REPL代码没有单独的作用域,因此它很容易通过覆盖内置对象而被破坏。Node.js的js代码将由于修改这些对象而表现不正确,并导致TypeError
s.对象
和数字
示例的错误是显而易见的(错误也会在chrome中抛出)。至于数组
示例,您必须提供更多的上下文,是什么代码抛出了错误?@ibrahimmahrir我可以复制它,只需运行Node,键入函数数组(){}
然后按ENTER键是的,这很奇怪。但我猜nodejs REPL与chrome的控制台有很大不同。@ibrahimmahrir只需运行函数数组(){}
就会抛出
internal/util/inspect.js:292
const descriptor = Object.getOwnPropertyDescriptor(obj, 'constructor');
^
TypeError: Object.getOwnPropertyDescriptor is not a function
at getConstructorName (internal/util/inspect.js:292:31)
at formatRaw (internal/util/inspect.js:477:23)
... (other stacks)
at Domain._errorHandler (domain.js:224:23)
at Object.setUncaughtExceptionCaptureCallback (domain.js:140:29)
at process._fatalException (internal/bootstrap/node.js:490:31)
internal/async_hooks.js:121
if (!Number.isSafeInteger(asyncId) || asyncId < -1) {
^
TypeError: Number.isSafeInteger is not a function
at validateAsyncId (internal/async_hooks.js:121:15)
at emitInitScript (internal/async_hooks.js:317:3)
...
at WriteStream.Socket._write (net.js:725:8)
at doWrite (_stream_writable.js:410:12)