在coffeescript的默认包装器中访问文档

时间:2011-08-05 04:27:20

标签: javascript coffeescript

Coffeescript将您的代码包装成像

这样的包装器
(function() { 
/* your code */
}).call(this);

此处,this表示window。因此,要创建公共接口,我会执行类似

的操作
this.publicObject =
  someMethod: ->
    document.getElementById("button1").innerHTML = "Changed!"

然后我可以在HTML文档中注册一个回调,调用我的.js文件,类似<span onclick="publicObject.someMethod();">Click</span>

但是,如果我想从.coffee文件中调用someMethod(在文档就绪时调用,我认为编辑:请参阅下面接受的答案+评论)该怎么办?如果我只是按照上面的代码

publicObject.someMethod()

由于上下文问题,似乎在someMethod中无法访问文档对象。 如何从我的.coffee文件中调用publicObject.someMethod()并让其识别document

注意:apply()call()技巧是可以的,但如果可能的话,我不想摆脱包装器。如果您在意,我使用以下内容编译我的脚本:

coffee -j -p -c coffee/*.coffee > www/app.js

2 个答案:

答案 0 :(得分:4)

window.publicObject.someMethod()。这避免了整个变量this范围问题。您可以在CS代码的顶级范围内互换使用thiswindow,但一旦进入函数内部,就需要使用window。我建议始终使用window作为A)更清晰,并且B)回避导致无数小时头部刮伤的整个this问题。

此外,这是我使用的命名空间模式。我创建了1个顶级全局对象,并将所有内容整齐地挂掉。它就像这样开始。

OT = window.OT = {} #root of the public API namespace
OT.someNestedPublicObj = {}

答案 1 :(得分:4)

包装器不会隐藏document,这是一个全局因为它附加到window。除非您在document文件中声明了名为.coffee的变量(通过撰写document = ...),否则document可以从someMethod访问。尝试将console.log document添加到someMethod的顶部以自行检查。

所以必须有其他事情发生。调用someMethod时得到的错误消息究竟是什么?