未捕获的ReferenceError:在coffeescript中命名空间时未定义命名空间

时间:2012-05-07 15:35:13

标签: namespaces coffeescript

大家好:我正在尝试创建一个命名空间,这样我就可以在整个应用程序中使用不同coffeescript文件中的一个类(至少这是我对你使用命名空间的理解)

我在这里找到了一个很好的例子:Classes within Coffeescript 'Namespace'

摘录:

    namespace "Project.Something", (exports) ->
      exports.MyFirstClass = MyFirstClass
      exports.MySecondClass = MySecondClass

但是,当我实现它时,我得到:命名空间未在我的控制台中定义。

我的命名空间在上面的示例中完全按照它的外观实现。似乎我的命名空间定义不会被coffeescript以某种方式识别出来。

任何想法?可能会出现版权问题吗?

提前致谢!!!

1 个答案:

答案 0 :(得分:7)

该问题的namespace函数:

namespace = (target, name, block) ->
  [target, name, block] = [(if typeof exports isnt 'undefined' then exports else window), arguments...] if arguments.length < 3
  top    = target
  target = target[item] or= {} for item in name.split '.'
  block target, top

不是CoffeeScript的一部分,您必须自己定义该帮助程序。大概你不想在每个文件中重复它,所以你有一个包含namespace.coffee定义的util.coffee文件(或namespace或...)。但是接下来你会遇到将namespace函数放入全局命名空间的问题。你可以do it by hand

namespace = (target, name, block) ->
  [target, name, block] = [(if typeof exports isnt 'undefined' then exports else window), arguments...] if arguments.length < 3
  top    = target
  target = target[item] or= {} for item in name.split '.'
  block target, top

(exports ? @).namespace = namespace
# or just (exports ? @).namespace = (target, name, block) -> #...

演示:http://jsfiddle.net/ambiguous/Uv646/

或者你可以变得时髦并使用namespace将自己置于全球范围内:

namespace = (target, name, block) -> #...
namespace '', (exports, root) -> root.namespace = namespace

演示:http://jsfiddle.net/ambiguous/3dkXa/

完成其中一项操作后,您的namespace功能应该随处可用。