木偶 - 在函数或对象中使用listenTo

时间:2015-11-26 15:57:34

标签: javascript marionette

我正在尝试使用这样的东西:

var a = Marionette.Object.extend({
    initialize: function () {
        //Works fine
        this.listenTo(this, "something", function(){...});

        //Problem
        (function(){
            this.listenTo(this, "somethingElse", function(){...});
        })();

        //Same...
        var b = function(){
            this.listenTo(this, "somethingElse", function(){...});
        }

        b();
    }
});

当我尝试运行此代码时,它会说:

  

无法读取未定义的属性'listenTo'

用于功能。但问题是为什么?

据我所知,initialization: get被调用,当一切准备就绪时,这就是为什么开头的另一个听众工作的原因。如果我将监听器放入函数中,它应该是相同的,因为,当它被调用时,对象已经初始化,因此this存在。

任何想法如何解决这个问题,将侦听器留在函数内?

提前致谢!

上述解决方案(感谢sp00m)

- 新问题 -

在对象中实现相同的目标:

var a = Marionette.Object.extend({
    b: (function(){
        this.listenTo(this, "somethingElse", function(){...});
    })()
});

2 个答案:

答案 0 :(得分:1)

您可以使用var self = this成语:

var a = Marionette.Object.extend({
  initialize: function () {

    var self = this; // maintain a reference to initialize's this

    (function(){
        self.listenTo(self, "somethingElse", function(){...});
    })();

  }
});

更多详情:What underlies this JavaScript idiom: var self = this?

答案 1 :(得分:0)

使用this

.bind(this)传递给您的函数
var a = Marionette.Object.extend({
    b: (function(){
        this.listenTo(this, "somethingElse", function(){...});
    }.bind(this)()
});

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind