Coffeescript 如何从闭包内部调用实例方法?
我试图访问Coffeescript 如何从闭包内部调用实例方法?,coffeescript,Coffeescript,我试图访问map调用中的实例方法,不幸的是,我对实例对象的引用被重新定义为Window。我不确定如何获得我的实例方法: class Test constructor: (@an_array) -> f: () -> @an_array.map (value) -> @a(value) a: (value) -> alert value t = new Test [1, 2, 3] t.f() // TypeError: Obj
map
调用中的实例方法,不幸的是,我对实例对象的引用被重新定义为Window。我不确定如何获得我的实例方法:
class Test
constructor: (@an_array) ->
f: () ->
@an_array.map (value) ->
@a(value)
a: (value) ->
alert value
t = new Test [1, 2, 3]
t.f() // TypeError: Object [object Window] has no method 'a'
通过定义一个变量来保存对该
的引用,我发现我可以做到这一点:
class Test
constructor: (@an_array) ->
f: () ->
self = @
@an_array.map (value) ->
self.a(value)
a: (value) ->
alert value
t = new Test [1, 2, 3]
t.f() // raises 3 alerts: 1, 2, 3
这感觉有点像黑客,所以我将把问答留给别人,让他们教我该如何做有多种方法可以解决这个问题
CoffeeScript中最常见的是使用生成绑定函数:
@an_array.map (value) => @a(value)
_this = @
@an_array.map (value) -> _this.a(value)
演示:
标准JavaScript方法也会起作用(有时是必要的或更合适的):
保存对@
的引用,这样您就不必关心回调函数中的内容:
@an_array.map (value) => @a(value)
_this = @
@an_array.map (value) -> _this.a(value)
演示:
我倾向于使用\u this
而不是self
作为这个东西的名称,因为如果忘记JavaScript中的var
,就会出现一些有趣的bug
使用手动创建绑定函数,但这并不是普遍支持的:
@an_array.map ((value) -> @a(value)).bind(@)
演示:
使用jQuery、下划线或其他非本机绑定函数实现:
@an_array.map _((value) -> @a(value)).bind(@)
演示:
您选择哪一个取决于您的环境和具体需求:
如果您试图绑定一个来自其他地方的函数,那么您不能使用=>
,因此您需要使用上面的(2)或(3)(或可能或)的一些变体
如果您同时需要内部和外部此
,那么您可以选择(1)
如果您需要手动绑定一个函数,但不确定是否存在本机的bind
,那么您可能会得到(3),而(3)的哪个分支可能取决于您已经拥有的库
利润
@你应该回答这个问题,我会把它标记为接受。这就是我要找的!或者我们可以把它作为副本,我想我已经回答了这个问题。如果你把问题解决了,我很高兴。@muistoshort我已经用了一段时间了,但我找不到答案。。。如果我们离开它,可能会帮助某人。我为后代添加了一个答案,这种东西很难搜索,你可能会注意到,我搜索的是我已经知道的答案,而不是一个问题:)