Coffeescript 咖啡脚本:为什么赢了';我的课堂作业没有加前缀window吗?

Coffeescript 咖啡脚本:为什么赢了';我的课堂作业没有加前缀window吗?,coffeescript,Coffeescript,我有一个外部文件,其中定义了我的类: class MyClass constructor: -> alert 'hello' 当CoffeeScript被编译成JavaScript时,它会用闭包将其包装起来。因此,当我尝试在一些JavaScript中使用它时: $(function(){ var ob = new MyClass(); }); 我得到一个错误: Uncaught ReferenceError: MyClass is not defined 但是如果我在

我有一个外部文件,其中定义了我的类:

class MyClass
  constructor: ->
    alert 'hello'
当CoffeeScript被编译成JavaScript时,它会用闭包将其包装起来。因此,当我尝试在一些JavaScript中使用它时:

$(function(){
  var ob = new MyClass();
});
我得到一个错误:

Uncaught ReferenceError: MyClass is not defined
但是如果我在类名前面加上window,它会起作用:

class window.MyClass
  constructor: ->
    alert 'hello'

如何定义类而不使用window作为前缀?

您可以使用
--bare
编译CoffeeScript,但通常不建议这样做,因为您可能会污染全局命名空间

我的建议是将类附加到
窗口
对象,就像您的第二个示例一样,或者更好地使用CoffeeScript文档中的这个名称空间函数将类附加到附加到
窗口

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

# Usage:
#
namespace 'Hello.World', (exports) ->
  # `exports` is where you attach namespace members
  exports.hi = -> console.log 'Hi World!'

namespace 'Say.Hello', (exports, top) ->
  # `top` is a reference to the main namespace
  exports.fn = -> top.Hello.World.hi()

Say.Hello.fn()  # prints 'Hi World!'
namespace=(目标、名称、块)->
[目标、名称、块]=[(如果导出类型不是“未定义”,则导出其他窗口)、参数…]如果arguments.length<3
顶部=目标
target=target[item]或={}用于name.split.'中的项
顶住目标
#用法:
#
名称空间“Hello.World”(导出)->
#“exports”是附加命名空间成员的位置
exports.hi=->console.log“hi World!”
名称空间“Say.Hello”,(导出,顶部)->
#'top'是对主命名空间的引用
exports.fn=->top.Hello.World.hi()
Say.Hello.fn()打印“嗨,世界!”

来源:

您可以使用
--bare
编译CoffeeScript,但通常不建议这样做,因为您可能会污染全局命名空间

我的建议是将类附加到
窗口
对象,就像您的第二个示例一样,或者更好地使用CoffeeScript文档中的这个名称空间函数将类附加到附加到
窗口

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

# Usage:
#
namespace 'Hello.World', (exports) ->
  # `exports` is where you attach namespace members
  exports.hi = -> console.log 'Hi World!'

namespace 'Say.Hello', (exports, top) ->
  # `top` is a reference to the main namespace
  exports.fn = -> top.Hello.World.hi()

Say.Hello.fn()  # prints 'Hi World!'
namespace=(目标、名称、块)->
[目标、名称、块]=[(如果导出类型不是“未定义”,则导出其他窗口)、参数…]如果arguments.length<3
顶部=目标
target=target[item]或={}用于name.split.'中的项
顶住目标
#用法:
#
名称空间“Hello.World”(导出)->
#“exports”是附加命名空间成员的位置
exports.hi=->console.log“hi World!”
名称空间“Say.Hello”,(导出,顶部)->
#'top'是对主命名空间的引用
exports.fn=->top.Hello.World.hi()
Say.Hello.fn()打印“嗨,世界!”

资料来源:

我经常做self.MyClass=class MyClass并且想知道是否有更好的方法。顺便说一句,我使用了
self
,因为它更便于携带,网络工作者没有
窗口
对象。我经常使用
self.MyClass=class MyClass
,我想知道是否有更好的方法。顺便说一句,我使用了
self
,因为它更便于携带,web工作者没有
窗口
对象。