gpt4 book ai didi

javascript - 为什么在 nodejs REPL 中运行 function Array(){} 会破坏 nodejs

转载 作者:行者123 更新时间:2023-11-30 06:20:16 25 4
gpt4 key购买 nike

几分钟前,我想到了在用户脚本范围内重新定义内置 Array 构造函数的想法,例如:

function Array () {}

在 Chrome 开发工具中,它覆盖了全局范围(所有 <script>)的内置 Array 但保留了 Chrome 的 js 范围未修改(这意味着 Chrome 本身的 js 代码可以工作正确),如我所料。

但是,当我在 Node.js 中执行测试时,我得到了很多这样的东西(更具体地说,每个 tick 一个):

> TypeError: Cannot read property 'length' of undefined
at onwriteDrain (_stream_writable.js:488:13)
at afterWrite (_stream_writable.js:478:5)
at process._tickCallback (internal/process/next_tick.js:63:19)

它一直在输出,而 Node.js 对我的输入没有任何响应,所以我必须终止它。我执行了进一步的测试,例如 function Object () {}function Number () {},两者都导致了 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_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)

(在 Node.js REPL 中执行 function String () {} 一开始没问题,但进一步输入和移动光标会导致它退出)

我知道在Node.js的脚本文件运行方式下,内容会被(function (exports, require, module, __filename, __dirname) {包裹,从而修改当前作用域不会干扰 Node.js 的内部脚本范围。

那么为什么修改ObjectArray等会导致Node.js REPL意外退出呢?这对我来说没有意义......

I'm using Node.js 10.12.0 on macOS with nvm as version manager.

Also tested on Node.js 8.9.4 and got similar results.

希望有人能帮忙!

最佳答案

花了几个小时在 Internet 上搜索...

然后我找到了thisnodejs/help 仓库中:

Creating a variable using var in the global scope creates (overrides) property of the global object with the same name. Therefore var Date = 3 is equivalent to global.Date = 3, but Date is used by Node.js REPL script.

The only way to safely execute scripts in REPL is to run them in a separate realm, which Node.js doesn't currently do. Otherwise, user scripts may override any of the useful global properties.

It is not hard to break REPL. For example, String.prototype.replace = null also terminates the process.

所以,这似乎与我的问题有关,在仔细研究 Node.js 源代码后,我发现 REPL 代码没有单独的范围,因此可以通过覆盖内置对象轻松破坏它.由于这些对象的修改,Node.js 的 js 代码将表现不正确,并导致 TypeError

关于javascript - 为什么在 nodejs REPL 中运行 function Array(){} 会破坏 nodejs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53577119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com