我在匿名函数
中@
关键字的范围有些问题
(这不是正在发生的事情,但我的例子需要它)
createArray = (fun) -> fun()
这是示例类
class Example
stuff: []
otherStuff: createArray ->
@stuff
@
指向window
(我推测)。所以我调查了这一点,并记得fat arrow创建了一个生成器函数。
我试过这个
class Example
stuff: []
otherStuff: createArray =>
@stuff
但它甚至没有编译成function(_this) { ...}(this)
。所以我开始尝试用生成器包装所有东西
class Example
stuff: []
otherStuff: =>
createArray ->
@stuff
...
otherStuff: =>
stuff = @stuff
createArray ->
stuff
...
otherStuff: ((stuff) ->
createArray ->
stuff
)(@stuff) #this is the one that upsets me the most because it compiles to Example.stuff and not to Example.prototype.stuff
但这些都不起作用。
在切换到简单function
而不是class
之前,有没有办法实现我想要的目标?
答案 0 :(得分:1)
otherStuff: createArray ->
@stuff
这是在课程定义时运行,而不是在执行otherStuff()
时运行。那时没有this
(@
),因为还没有实例化对象。基本上这是在做:
Example.prototype.otherStuff = (function () { return this.stuff; })();
// which boils down to:
Example.prototype.otherStuff = this.stuff;
显然,this
此时与Example
的实例无关。
如果您希望@
引用Example
的当前实例,则需要推迟执行函数,直到您有实例并调用otherStuff
:
otherStuff: ->
createArray ->
@stuff
现在内部函数将丢失其上下文,您需要使用fat-arrow绑定它:
otherStuff: ->
createArray =>
@stuff