我是 CoffeeScript 的新手,有一个关于访问函数的问题。
鉴于下面的代码,我将如何从构造函数的 for 循环中访问 checkType 函数?
class ApplicationForm.Save
constructor: (@formItems) ->
@that = this
for item in @formItems
do ->
checkType(item)
checkType: (forItem) ->
console.log(@formItem.find("input").length)
最佳答案
这里似乎有点困惑:
@that = this
没有任何意义。您似乎正在尝试重现常见的 JavaScript 习惯用法:var that = this;
这样您就可以在其他地方使用所需的
this
。但@
不用于声明变量(CoffeeScript 自动执行此操作),@
只是this.
的简写。你说的是this.that = this
但这没有任何用处。
当您需要立即计算循环变量而不是仅仅获取引用时,在循环中使用 do
。常见的情况是这样的:for i in [0, 1, 2] $(".something#{i}").click -> console.log(i)
无论点击什么内容,该代码都会导致所有内容都显示
2
,因为所有匿名回调都使用相同的i
引用。添加do
只是将循环体包装在自调用函数中,以强制循环变量取消引用,因此:for i in [0, 1, 2] do (i) -> # do something with `i`...
就像这样的 JavaScript:
for(i = 0; i <= 2; ++i) (function(i) { // do something with `i`... })(i)
您已经将
item
传递给函数,因此do
是多余的。您的
checkType(item)
正在尝试调用不存在的函数。您似乎想要调用checkType
方法,然后回到@
的含义,我们看到您需要使用@
来调用this
上的该方法:@checkType(item)
您的
checkType
方法有一个forItem
参数,但您在该方法内使用@formItem
。但同样,@
正是我们在 CoffeeScript 中说this
的方式,因此似乎存在拼写错误的组合(forItem
与formItem
)以及对@
含义的一些混淆。您的checkType
可能应如下所示:checkType: (formItem) -> console.log(formItem.find("input").length)
将所有这些放在一起可以得出:
class ApplicationForm.Save
constructor: (@formItems) ->
for item in @formItems
@checkType(item)
checkType: (formItem) ->
console.log(formItem.find("input").length)
关于javascript - Coffeescript 访问函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33243921/