课堂上@关键字的coffeescript范围

时间:2016-03-23 14:45:15

标签: coffeescript scoping

我在匿名函数

@关键字的范围有些问题

(这不是正在发生的事情,但我的例子需要它)

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之前,有没有办法实现我想要的目标?

1 个答案:

答案 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