【问题标题】:Coffeescript closures and arrays of random numbersCoffeescript 闭包和随机数数组
【发布时间】:2014-01-14 12:00:39
【问题描述】:

运行以下咖啡脚本始终会导致数组全部为假。 我的问题是“为什么?”

class A
    probability: 0.5
    gen: (f) -> f() for x in [0...10]
    init: -> alert @gen -> Math.random()<@probability
    constructor: -> @init()

new A

这与以下几乎相同的脚本形成对比, 它通常返回真假混合,

class B
    gen: (f) -> f() for x in [0...10]
    init: -> alert @gen -> Math.random()<0.5
    constructor: -> @init()

new B

如下

probability = 0.5
gen = (f) -> f() for x in [0...10]
init = -> alert gen -> Math.random()<probability

init()

还有以下

gen = (f) -> f() for x in [0...10]
init = -> alert gen -> Math.random()<0.5

init()

为什么第一个脚本的行为与其他脚本不同,尤其是第二个? 当然,将概率参数保留为变量很有用。

我是否遗漏了一些关于闭包的内容? 谢谢!

【问题讨论】:

    标签: javascript coffeescript functional-programming closures


    【解决方案1】:

    您必须使用"fat arrow" 在正确的上下文中执行回调:

    alert @gen => Math.random()<@probability
    

    否则this 不会在回调中引用正确的对象,@probability 会被解析为错误的值。


    或者,您可以更改gen,以便始终在实例的上下文中执行回调(即作为实例方法):

    f.call(this) for x in [0...10]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      相关资源
      最近更新 更多