如何将参数传递给coffeescript中的匿名函数?

时间:2016-10-12 17:49:06

标签: javascript coffeescript parameter-passing

基本上我需要将参数传递给coffeescript中的匿名函数,而且我已经没有了想法。

这是我的代码:

audio = {
        sounds: {},
        sources: [{
            wind: 'sounds/wind.mp3'
        }],
        load: (callback) ->
            this.totalFiles = Object.size(this.sources[0])
            for key of this.sources[0]
                sound = new Howl({ src: [this.sources[0][key]] })
                self = this
                sound.once('load', (key) =>
                    (key) ->
                        self.sounds[key] = this
                        if Object.size(self.sounds) == self.totalFiles
                            if typeof callback == 'function' then callback()
                (key)) <- THIS ARGUMENT PASSING DOES NOT COMPILE CORRECTLY
        loop: (name) ->
            this.sounds[name].loop(true)
            console.log this.sounds
    }

使用callback.call()的代码:

load: (callback) ->
    this.totalFiles = Object.size(this.sources[0])
    for key of this.sources[0]
        sound = new Howl({ src: [this.sources[0][key]] })
        self = this
        sound.once('load', (key) =>
            callback.call(() ->
                self.sounds[key] = this
                if Object.size(self.sounds) == self.totalFiles
                    if typeof callback == 'function' then callback()
            , key)
        )

使用callback.call()或callback.apply()我得到相同的结果,相同的编译javascript。我试图在已编译的javascript中添加(key)我需要的地方,并按预期工作。

对象大小:

Object.size = (obj) ->
        size = 0
        for key in obj then if obj.hasOwnProperty(key) then size++
        return size

我在stackoverflow上找到的一个好帮手函数。

2 个答案:

答案 0 :(得分:0)

您的代码存在一些可能隐藏真正问​​题的问题:

  • 不一致的缩进
  • self = this回调sound.once是一个胖箭头函数,意思是该行 self.sounds[key] = this这和自己是一样的
  • 包含许多不必要的括号。
  • 在对象属性定义中使用逗号不一致。

AFAIK实际问题是你试图打电话给IIFE,而你需要parens:

sound.once('load', ((key) =>
    (key) ->
         self.sounds[key] = this
         if Object.size(self.sounds) == self.totalFiles
            if typeof callback == 'function' then callback()
)(key))

除非您过度使用了名称key。您已经使用名为key的参数部分应用了一个函数,然后返回的函数采用名为key的参数?这是什么?

答案 1 :(得分:0)

这对我有用:

sound.once('load', ((key) =>
    () ->
        self.sounds[key] = this
            if Object.size(self.sounds) == self.totalFiles
                if typeof callback == 'function' then callback()
        )(key)
    )