Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么在nodejs REPL中运行函数Array(){}会破坏nodejs_Javascript_Node.js - Fatal编程技术网

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)