第2章 Node与REPL
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。
2.1 REPL:先睹为快和未定义的表达式
Node学习指南
只需要输入node命令就可以运行repl,不需要提供任何Node应用文件作参数:
$ node
REPL默认尖括号>为命令行提示符。在该符号之后输入的任何内容都由底层的V8 JavaScript引擎进行处理。
REPL的使用很简单,就像在文件中编写JavaScript一样:
> a = 2;
2
REPL可以即时打印输入的任何表达式的结果。在上面例子中,表达式的结果是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打印输出。