我刚刚开始使用Coffeescript和Coffeescript控制台以及Underscore。但是,每当我定义一个函数时,Coffeescript都会确定_
表示该函数,并且似乎忘记了_ = require 'underscore'
的初始赋值。
为什么会这样?我该如何预防呢? (我真的希望能够将我的文件中的粘贴代码复制到控制台中。)
(_
在Coffeescript控制台中是否有一些特殊含义?这是否意味着“最后的结果”或什么?这可以解释我的问题?)
详细说明:
$ coffee
coffee> _.contains [1, 2, 3], 3 # no Underscore, initially
TypeError: Cannot call method 'contains' of undefined
at ...
coffee>
coffee> _ = require 'underscore'
{ [Function]
_: [Circular],
VERSION: '1.3.3',
forEach: [Function],
...
coffee> _.contains [1, 2, 3], 3 # now Underscore works fine
true
coffee>
------> someFunction = (a, b) -> # define a function ...
......> a + b
[Function]
coffee>
coffee> _.contains [1, 2, 3], 3 # now `_` is not Underscore any more!
TypeError: Object function (a, b) { # Does `_` mean "last result" or sth?
return a + b;
} has no method 'contains'
at evalmachine.<anonymous>:3:7
at Object.eval (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/coffee-script.js:142:17)
at Interface.<anonymous> (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/repl.js:131:40)
at Interface.emit (events.js:67:17)
at Interface._onLine (readline.js:162:10)
at Interface._line (readline.js:426:8)
at Interface._ttyWrite (readline.js:603:14)
at ReadStream.<anonymous> (readline.js:82:12)
at ReadStream.emit (events.js:88:20)
at ReadStream._emitKey (tty.js:327:10)
coffee>
coffee> _ = require 'underscore'
coffee> _.contains [1, 2, 3], 3 # Now all is fine again, for a short while
true
答案 0 :(得分:20)
CoffeeScript REPL的核心是this JavaScript:
try {
_ = global._;
returnValue = CoffeeScript["eval"]("_=(" + code + "\n)", {
filename: 'repl',
modulename: 'repl'
});
if (returnValue === void 0) {
global._ = _;
}
repl.output.write("" + (inspect(returnValue, false, 2, enableColours)) + "\n");
} catch (err) {
error(err);
}
因此,如果最后一个命令返回了某些内容,那么_
就会出现这种情况。我找不到任何关于此的文档,但搜索_
并不是一项非常有成效的活动。如果您想在CoffeeScript REPL中使用Underscore.js,则必须将其称为_
以外的其他内容。
感谢Trevor Burnham(谁写了the book所以我认为我们可以信任他)我们知道CoffeeScript REPL使用_
作为最后一个匹配行为的结果node.js REPL:
REPL功能
[...]
特殊变量_
(下划线)包含最后一个表达式的结果。
Ruby的irb
做同样的事情。