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
答案 0 :(得分:4)
做window.publicObject.someMethod()
。这避免了整个变量this
范围问题。您可以在CS代码的顶级范围内互换使用this
和window
,但一旦进入函数内部,就需要使用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
时得到的错误消息究竟是什么?