59

我想评价

var foo = "foo";
console.log(foo);

作为一个块,而不是逐行评估

var foo = "foo";
undefined
console.log(foo);
foo
undefined

有没有一种简单的方法可以将提示移到下一行?

4

5 回答 5

108

Node v6.4 有一个editor模式。在 repl 提示符下键入.editor,您可以输入多行。

例子

$ node                                                                                                   
> .editor
// Entering editor mode (^D to finish, ^C to cancel)
const fn = there => `why hello ${there}`;
fn('multiline');
// hit ^D 
'why hello multiline'
> // 'block' gets evaluated and back in single line mode.

这是所有特殊 repl 命令的文档 https://nodejs.org/api/repl.html#repl_commands_and_special_keys

于 2016-08-24T21:49:25.590 回答
24

您可以使用if(1){开始一个在您输入之前不会完成的块}。它将打印块最后一行的值。

> {
... var foo = "foo";
... console.log(foo);
... }
foo
undefined

在多行模式下,你会错过很多 REPL 的细节,比如自动完成和语法错误的即时通知。如果由于块内的一些语法错误而卡在多行模式,请使用^C返回到正常提示。

于 2015-03-23T05:46:51.537 回答
3

jhnstn 的解决方案是完美的,但如果您正在寻找其他替代方案,您可以将代码放在多行字符串中,然后eval像这样:

> let myLongCode = `
... let a = 1;
... let b = 2;
... console.log(a + b);
... `;
> eval(myLongCode)
> 3

当然这是一个 hack ;)

于 2018-03-21T21:36:38.573 回答
0

可能我没看懂问题,但是如果你想在repl的控制台写多行命令,你可以使用shift+enter移动到下一行。

于 2019-01-26T22:08:41.513 回答
0

Node.js REPL 支持块并且能够从块中返回最后一个表达式,其他一些控制台实现也是如此(Chrome devtools 控制台)。

这可能会导致语法错误,这是 Node 10.9.0 中的重大更改{可以是一个对象字面量,一个块不能被明确地评估为一个块:

{
var foo = "foo";
console.log(foo);
}

虽然这可以明确地评估为一个块并将返回undefined

;{
var foo = "foo";
console.log(foo);
}

由于记录了块中的最后一个表达式,console.log因此此处不需要:

;{
var foo = "foo";
foo;
}

请注意,这是块作用域,因此let不会const泄漏class到 REPL 作用域,这种行为可能是可取的,也可能不是。

于 2018-10-25T10:22:46.043 回答