本节书摘来自异步社区《Node学习指南》一书中的第2章,第2.1节,作者【美】Shelley Powers,更多章节内容可以访问云栖社区“异步社区”公众号查看
Node学习指南尝试使用Node编写自定义的模块或者应用程序时,并不需要每次运行写好的JavaScript文件来测试代码功能。Node有一个交互式组件称为REPL(read-eval-print-loop,读取求值列印循环),这将是本章的主题。
REPL(发音为“repple”)支持简化的Emacs风格行编辑和一小部分基本命令。在REPL中输入任何内容都与用Node运行JavaScript编写的文件具有相同的处理方式。事实上,可以使用REPL编写整个应用程序——这样就可以频繁地对程序进行测试。
本章涉及REPL的一些有趣的技巧以及如何使用这些技巧,包括如何替换浏览历史命令的底层机制以及命令行编辑等内容。
最后,如果内建的REPL不能提供你所需要的交互环境,本章的后续部分会介绍用于创建自定义REPL的API。
提示:如何使用REPL:http://docs.nodejitsu.com/articles/REPL/how-to-use-nodejs-replNodejitsu。网站提供的如何创建自定义REPL的教程:http://docs.nodejitsu.com/articles/REPL/how-to-create-a-custom-repl。
Node学习指南只需要输入node命令就可以运行repl,不需要提供任何Node应用文件作参数:
$ nodeREPL默认尖括号>为命令行提示符。在该符号之后输入的任何内容都由底层的V8 JavaScript引擎进行处理。
REPL的使用很简单,就像在文件中编写JavaScript一样:
> a = 2; 2REPL可以即时打印输入的任何表达式的结果。在上面例子中,表达式的结果是2。下面这个例子中表达式结果是有三个元素的数组:
> b = ['a','b','c']; ['a','b','c']可以使用下划线“_”调用上一个表达式。本例中,a为2,结果表达式两次自增1:
> a = 2; 2 > _ ++; 3 > _ ++; 4还可以用下划线访问该对象的属性或者调用方法:
> ['apple','orange','lime'] [ 'apple','orange','lime'] > _.length 3 >3+ 4 7 > _.toString(); '7'在REPL中也可以使用var关键字。可以在之后通过变量名访问表达式或者变量。但是这样可能会得到意料之外的结果。比如,在REPL中输入以下命令行:
var a = 2;该表达式返回值并不是2,而是undefined。表达式结果为undefined的原因是变量赋值的表达式并不返回变量的值作为表达式的值。
理解以下代码,多少可以解释REPL中的这种现象:
console.log(eval('a = 2')); console.log(eval('var a = 2'));将上两行代码写入文件并用Node运行,返回值如下:
2 undefined第二行代码并没有返回结果给eval,因此返回值为undefined。要记得,REPL是read-eval-print loop,重点在eval,就是求值。
但是,在REPL中你仍旧可以使用该变量,像在Node应用中一样:
> var a = 2; undefined > a++; 2 > a++; 3后两条命令有返回值,由REPL打印输出。
相关资源:ts-node:用于Node.js的TypeScript执行和REPL-源码