CoffeeScript范围与一系列函数有关

时间:2012-05-23 18:55:49

标签: scope coffeescript

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,其中thistestClass) 如果我这样做,一切正常:

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

但这似乎不是CoffeeScript惯用的。

1 个答案:

答案 0 :(得分:1)

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

我可以通过几种方式来解决这个问题,虽然它们都不是特别难看,但它们都没有特别优雅。

首先,您提出的解决方案是在update函数中绑定函数。第二个是相似的,但将绑定移到别处:

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

testClass.addFunc( -> ... )

第三个选项是使用bind function from underscore.js之类的东西将函数绑定到TestClass的创建点。虽然这可能最终比其他两个选项更加混乱。