为什么coffeescript会覆盖我的下划线?

时间:2014-04-01 17:30:29

标签: javascript coffeescript

我编写了以下代码,旨在将字符串连接到网址。

_ = 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'除外,这应该完全相同!

知道这里发生了什么吗?

1 个答案:

答案 0 :(得分:5)

与Python类似,REPL使每个表达式结果都可用_,就像在

中一样
> 5
5
> _ + 3
8

您的代码已翻译成

> _ = (_ = require 'underscore')
[snipped]
> _ = ({joinUrl} = require './joinurl')
{ joinUrl: [Function] }
> _ = (_)
{ joinUrl: [Function] }