gpt4 book ai didi

coffeescript - 如何从闭包内部调用实例方法?

转载 作者:行者123 更新时间:2023-12-04 23:24:53 25 4
gpt4 key购买 nike

我正在尝试访问 map 中的实例方法调用,不幸的是我对实例对象的引用被重新定义为 Window。我不确定如何获取我的实例方法:

class Test
constructor: (@an_array) ->

f: () ->
@an_array.map (value) ->
@a(value)

a: (value) ->
alert value

t = new Test [1, 2, 3]
t.f() // TypeError: Object [object Window] has no method 'a'

Here's a functional link to the above code

最佳答案

有多种方法可以解决这个问题。

CoffeeScript 中最常见的是使用 fat arrow ( => )产生一个绑定(bind)函数:

@an_array.map (value) => @a(value)

演示: http://jsfiddle.net/ambiguous/6BW8q/

标准的 JavaScript 方法也可以工作(有时是必要的或更合适的):
  • 保存对 @ 的引用这样您就不必关心 this在回调函数内部:
    _this = @
    @an_array.map (value) -> _this.a(value)

    演示:http://jsfiddle.net/ambiguous/XhP4z/

    我倾向于使用 _this而不是 self由于 window.self 的存在,作为这个东西的名称以及如果您忘记 var 会导致的有趣错误在 JavaScript 中。
  • 使用 Function.bind 手动创建绑定(bind)函数,但这并不是普遍支持的:
    @an_array.map ((value) -> @a(value)).bind(@)

    演示:http://jsfiddle.net/ambiguous/n2XnC/
  • 使用 jQuery 的 $.proxy , 下划线的 _.bind ,或其他一些非 native 绑定(bind)函数实现:
    @an_array.map _((value) -> @a(value)).bind(@)

    演示:http://jsfiddle.net/ambiguous/LAy9L/

  • 您选择哪一种取决于您的环境和特定需求:
  • 如果您尝试绑定(bind)来自其他地方的函数,则不能使用 =>所以你需要使用 的一些变体(2) (3) 以上(或可能 Function.call Function.apply )。
  • 如果你需要内外this同时你会选择 (1) .
  • 如果您需要手动绑定(bind)一个函数,但您不确定原生 bind存在,那么你可能最终得到 (3) 以及 的哪个分支| (3) 可能取决于您已经拥有的库。
  • ...
  • 利润。
  • 关于coffeescript - 如何从闭包内部调用实例方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14510926/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com