1

CoffeeScript 新手在这里。我对已推送到数组然后在类的成员函数中执行的函数的范围有一个奇怪的问题。基本上,似乎this没有正确设置。

class TestClass
    constructor: ->
        @functions = [] # my array of functions
        @member = "hello there! come find me!"
    update: =>
        func() for func in @functions

testClass = new TestClass
testClass.functions.push( -> 
    str = "could i find @member? " + @member? + "; this's keys: " + Object.keys(this)
    console.log(str)
)
testClass.update()

结果?奇怪的是,它是:

could i find @member? false; this's keys: 
top,location,window,external,chrome,v8Locale,document,$,jQuery,CoffeeScript

似乎调用函数的上下文是错误的。我认为通过将瘦箭头函数推到我的数组上,当调用该函数时,它将采用调用它的上下文 ( update,在哪里this)testClass如果我这样做,一切都会正常工作:

    update: =>
        func.call(this) for func in @functions

但这似乎不是很符合 CoffeeScript 的习惯。

4

1 回答 1

1

通过使用细箭头创建函数,您正在创建一个匿名函数,this该函数将绑定到window对象而不是调用它的上下文。 this除非两个函数碰巧绑定到同一个上下文,否则不会在函数调用中保持它的值。

我可以想出几种方法来解决这个问题,虽然它们都不是特别难看,但也没有一个特别优雅。

首先,您提出的解决方案是在更新函数中绑定函数。第二个类似,但将绑定移动到其他地方:

class TestClass
    ...
    addFunc: (func) ->
        @functions.push( => func.call( @ ) )

testClass.addFunc( -> ... )

第三种选择是使用类似underscore.js中的 bind 函数的东西在它被创建时将函数绑定到 TestClass。尽管这可能最终会比其他两个选项更混乱。

于 2012-05-23T19:59:55.780 回答