Javascript coffeescript中的名称空间

Javascript coffeescript中的名称空间,javascript,namespaces,coffeescript,Javascript,Namespaces,Coffeescript,我希望像在javascript中一样使用名称空间,使用关键字“with”,但CoffeeScript将其报告为保留关键字,并拒绝编译。有没有任何方法可以在cs中使用名称空间 特别是,我希望动态地包含一个CoffeeScript文件(可信源),就像加载数据库模式的模型一样,但我希望包含的脚本能够访问本地名称空间 编辑: 这是我想做的。我正在建立一个web框架,将目录树映射到基于express和mongoose的应用程序。例如,有一个子目录“models”,其中包含一个文件“user.coffee

我希望像在javascript中一样使用名称空间,使用关键字“with”,但CoffeeScript将其报告为保留关键字,并拒绝编译。有没有任何方法可以在cs中使用名称空间

特别是,我希望动态地包含一个CoffeeScript文件(可信源),就像加载数据库模式的模型一样,但我希望包含的脚本能够访问本地名称空间


编辑:

这是我想做的。我正在建立一个web框架,将目录树映射到基于express和mongoose的应用程序。例如,有一个子目录“models”,其中包含一个文件“user.coffee”,其内部代码如下:

name:
    type: String
    unique: on
profiles: [ Profile ]
其中,
Profile
是位于名为
model
的本地对象中的类。加载用户模型时,我希望它能够访问本地模型存储中的模型类

我目前的工作是将
model.Profile
写入文件“user.coffee”。希望我的意思很清楚


第二次编辑

下面是我如何在不使用
的情况下使用

咖啡

name:
    type: String
    unique: on
profiles: [ @profile ]
咖啡

content: String
下面是动态加载的方式:

for fm in fs.readdirSync "#{base}/models"
    m = path.basename fm, '.coffee'
    schema[m] = (()->
        new Schema coffee.eval (
            fs.readFileSync "#{base}/models/#{fm}", 'utf8'
        ), bare: on
    ).call model
    mongoose.model m, schema[m]
    model[m] = mongoose.model m
对我来说似乎是一个不错的解决方案。

不。但是,您可以使用来实现类似的效果

{foo, bar, baz} = require 'toocoollib'
foo 'whoa!'
您还应该知道,
with
关键字已被弃用,并且在ES5严格模式下是一个错误。主流JS黑客的共识是使用
是个坏主意


如果你发布了一个你想做的事情的例子,我可以给出一个更具体的答案。

强迫别人对你发表意见?现在是黑客时间™!

o =
  a: 1
  b: 2
  c: 3

`with(o) {//`
  alert a
`}`
“编译”为:


很遗憾,这是道格·克罗克福德的观点被当作福音的另一个领域。基于属性写入的模糊性拒绝它,但在与只读上下文对象(例如定义类似DSL的API的上下文对象)一起使用时忽略它的有用性。

刚刚在CoffeeScript常见问题解答页面上找到关于“变量导入”的内容:


CoffeeScript似乎不鼓励使用这种技术,也不支持这种技术。

Coco fork of CoffeeScript支持
语法的
;看见但是,该语法只是将
this
的值设置为块中的目标对象,而不是使用
关键字编译成有问题和不推荐的

假设您想用CoffeeScript中的
语法模仿Coco的
。你可以这样做:

withObj = (obj, func) -> func.call obj
然后你就可以写了

withObj = (obj, func) -> func.call obj
withObj annoyingly.lengthy.obj.reference, ->
  @foo = 'bar'
  @bar = 'baz'
当然,在这种简单的情况下,最好使用jQuery或下划线的
extend

_.extend annoyingly.lengthy.obj.reference, foo: 'bar', bar: 'baz'

顺便说一句,我使用的是node,到目前为止,它似乎还没有对
抱怨过。我已经指定了这个示例,希望它能清楚地说明我想要实现的目标:-)分解任务对我不起作用,因为我事先不知道名称。但我发现了另一种可能性,即使用匿名函数及其调用方法,传递我想要延迟的未知对象。不管怎样,这在CS和ES5严格模式中都是语法错误,因此责任工程师应该避免。但这不仅仅是Crockford。正如lawnsea指出的那样,
with
在ES5严格模式中被弃用和禁止。(仅此一点就足以让CoffeeScript不编译到它中。)它在大多数JS环境中也有巨大的性能影响(例如,尝试)。ES5严格模式是,因此对于那些认为它在真正有用的特定场景中有用的人来说,
with
不会有任何用处。这个答案是错误的。如果你从谷歌来到这里,不要这样做。如果咖啡决定包含
“严格使用”,会发生什么情况以后在编译的JS中?除非没有其他选择,否则不要将JS内联到CoffeeScript中。在这种情况下,解构赋值或Trevor的答案就可以了,只要试一下就可以了。谢谢但是,如果有一个解决方案可以不使用
而使用
的话,我更喜欢这个方案……恐怕您的编辑并没有让您的意图更加清晰。您能否为
模型.Profile添加代表性代码以及您希望如何使用它?定义
模型时,请在
模型
前面粘贴
@
class@Profile
。由于
这个
全局的
,这将使它成为一个名为
的全局配置文件
。无需更改
user.coffee
(尽管您可以编写
@Profile
以更清楚地说明您引用的是全局文件)。Profile是一个mongoose架构,它是以与user相同的方式动态定义的:通过CoffeeScript文件。这是咖啡。所以我不能全局地定义它。尽管如此,我还是想避免使用全局定义。但是,我会给出一个“A”的尝试,它是咖啡代码中的<代码>这个<代码>的同义词,对吧?如果<代码> @ />代码编译成<代码>这个< />代码,我不能在其他函数中使用它,比如回调函数,因为它将引用那个函数…顺便说一下,我现在考虑使用<代码>咖啡。相反,您可以使用
require
来解析COFF脚本文件。谢谢您的提示。我使用了call方法。忘了吧。
_.extend annoyingly.lengthy.obj.reference, foo: 'bar', bar: 'baz'