JavaScript CoffeeScript Function binding 一个不方便的地方

Rei · 2013年04月27日 · 最后由 zj0713001 回复于 2013年04月27日 · 3710 次阅读
$('#something').on 'click', ->
  this.bar

对应

$('#something').on('click', function() {
  return this.bar;
});

而这段

$('#something').on 'click', =>
  this.bar

对应

var _this = this;

$('#something').on('click', function() {
  return _this.bar;
});

好像写不了这样的代码(同时访问两个作用域的 this)

this.bar = 'outer';
var _this = this;

$('#something').on('click', function() {
  this.bar != _this.bar;
})

不知是不是我用错了。

$('#something').on 'click', (e) =>
  this.bar = e.currentTarget.bar

这样?

你是只是嫌它不方便还是觉得做不到?

-> 产生的 this 指向的是 $('#something')

=> 产生的 this 是外面的 this 吧

何不直接:

that = this
$('#something').on 'click', ->
  this.bar != that.bar

#4 楼 @ashchan 我想也只好这样了,=> 就用不上了。

我用到的是这样的情况,类里面有变量,在 click 里面要用那个变量,又需要 click 的 this 来判断鼠标点在哪个元素上面的时候,就需要同时访问两个作用于的 this。如果 click 里面不需要用 this,我就用 fat arrow 省掉 that 这个变量

class Audio
  constructor: ->
    @audio = audiojs.createAll()
  bindEventForClickToPlay: ->
    that = this
    $('.playlist li').click (e) ->
      e.preventDefault()
      that.audio.play($(this).data("url"))
class Audio
  constructor: ->
    @audio = audiojs.createAll()
  bindEventForClickToPlay: ->
    $('.playlist li').click (e) =>
      e.preventDefault()
      @audio.playAll()
需要 登录 后方可回复, 如果你还没有账号请 注册新账号