我编写了以下代码,旨在将字符串连接到网址。
_ = require 'underscore'
exports.joinUrl = (start, rest...) ->
for item in rest
if _.last start is '/'
if _.first item is '/'
start += item[1..]
else
start += item
else
if _.first item is '/'
start += item
else
start += '/' + item
start
当我启动coffeescript repl时,会发生一件非常奇怪的事情:
> _ = require 'underscore'
[snipped]
> {joinUrl} = require './joinurl'
{ joinUrl: [Function] }
> _
{ joinUrl: [Function] }
咦?以某种方式导入joinUrl
会覆盖变量_
的定义。即使(a)coffeescript将上面粘贴的模块包装到一个函数中,因此变量_
的任何使用都不应该影响外部范围,并且(b)我不会在该代码中进行任何操作_
的任何作业,require 'underscore'
除外,这应该完全相同!
知道这里发生了什么吗?
答案 0 :(得分:5)
与Python类似,REPL使每个表达式结果都可用_
,就像在
> 5
5
> _ + 3
8
您的代码已翻译成
> _ = (_ = require 'underscore')
[snipped]
> _ = ({joinUrl} = require './joinurl')
{ joinUrl: [Function] }
> _ = (_)
{ joinUrl: [Function] }