Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 主干JS事件可以调用匿名函数吗?_Javascript_Backbone.js_Backbone Events - Fatal编程技术网

Javascript 主干JS事件可以调用匿名函数吗?

Javascript 主干JS事件可以调用匿名函数吗?,javascript,backbone.js,backbone-events,Javascript,Backbone.js,Backbone Events,那么,让我们假设我在一个模型上有一个事件侦听器,如下所示: this.listenTo(anotherModel, 'change:whatever', this.myMethod); 什么是myMethod是一个超级简单的一行代码片段?我想在这种情况下使用匿名函数,但我似乎不能这样做 this.listenTo(anotherModel, 'change:whatever', function() { //The simplest code in the world }); 我能做什么

那么,让我们假设我在一个模型上有一个事件侦听器,如下所示:

this.listenTo(anotherModel, 'change:whatever', this.myMethod);
什么是myMethod是一个超级简单的一行代码片段?我想在这种情况下使用匿名函数,但我似乎不能这样做

this.listenTo(anotherModel, 'change:whatever', function() {
  //The simplest code in the world
});
我能做什么?还是我的对象注定要用单行方法填充?

是 绑定不需要访问视图实例的匿名函数:

this.listenTo(anotherModel, 'change:whatever', function() {
  console.log('whatever changed!');
});
绑定需要通过ECMAScript的function.Bind访问视图实例的匿名函数:

this.listenTo(anotherModel, 'change:whatever', function() {
  this.$el.append('whatever changed');
}.bind(this)); //the .bind here is key!
…或者只传递第四个参数,主干将为您绑定上下文

this.listenTo(anotherModel, 'change:whatever', function() {
  this.$el.append('whatever changed');
}, this); //the this here is key!
值得一提的是,从技术上讲,普通主干视图“方法”是一个匿名函数:

Backbone.View.extend({someMethod: function() {/*this function is anonymous technically*/}});
没关系。为了保持一致性,我始终将事件处理程序函数定义为视图方法,并通常清楚地命名它们:

Backbone.View.extend({
    events: {'click .start', 'onClickStart'},
    initialize: function () {
        this.listenTo(this.model, 'change', this.onChange);
    },
    onClickStart: function() {/*awesome code here*/},
    onChange: function() {/*more awesome code here*/}
});
请注意,这也有助于提高可测试性。

是 绑定不需要访问视图实例的匿名函数:

this.listenTo(anotherModel, 'change:whatever', function() {
  console.log('whatever changed!');
});
绑定需要通过ECMAScript的function.Bind访问视图实例的匿名函数:

this.listenTo(anotherModel, 'change:whatever', function() {
  this.$el.append('whatever changed');
}.bind(this)); //the .bind here is key!
…或者只传递第四个参数,主干将为您绑定上下文

this.listenTo(anotherModel, 'change:whatever', function() {
  this.$el.append('whatever changed');
}, this); //the this here is key!
值得一提的是,从技术上讲,普通主干视图“方法”是一个匿名函数:

Backbone.View.extend({someMethod: function() {/*this function is anonymous technically*/}});
没关系。为了保持一致性,我始终将事件处理程序函数定义为视图方法,并通常清楚地命名它们:

Backbone.View.extend({
    events: {'click .start', 'onClickStart'},
    initialize: function () {
        this.listenTo(this.model, 'change', this.onChange);
    },
    onClickStart: function() {/*awesome code here*/},
    onChange: function() {/*more awesome code here*/}
});

请注意,这也有助于可测试性。

除了匿名函数本身之外,没有任何函数可以调用匿名函数……这应该是正确和可能的。如果我没记错的话,我以前在listenTo中使用过匿名函数。这很有效。如果需要
this
引用模型,可以
bind
将其绑定,或者将变量设置为
this
并使用该变量。除了匿名函数本身之外,没有任何函数可以调用匿名函数……这应该是正确和可能的。如果我没记错的话,我以前在listenTo中使用过匿名函数。这很有效。如果您需要
来参考模型,
bind
it或者将一个变量设置为
this
并使用该变量。如果您不确定是否会有
函数,则总是会出现这种情况。bind
并且不想使用第四个参数。是的,但是如果匿名函数的目标是在那里有一些小代码,那么它的语法就会变得过于复杂,额外的一对带有uz.bind(function(){})的相距很远的paren是关于我画线的地方,只是把函数放在了其他地方,但是它是有效的,如果语法不困扰你,那就去做吧。这是一个极好且非常彻底的答案。我使用的是精确的语法,以前不起作用,但现在起作用了。奇怪的另一个后续问题:您可以将匿名函数与视图本身上的委托事件一起使用吗?因此,我可以使用
events:{'click':'myMethod'}
,而不是使用
events:{'click':function(){console.log('whatever!')}
否,您不能这样做。您需要在视图实例中包含方法名称的字符串。
events
hash只是一个方便的/helper构造,它希望方法名是字符串,而不是实际的函数对象。阅读源代码以了解详细信息,主干网在
delegateEvents
期间所做的事情非常简单。哦,我知道它是如何工作的。我想我的问题更像是有没有一个方便的方法来解决这个问题?我不想太多地干扰代理事件,但另一方面,我真的不认为我的视图需要60个方法。如果你不确定你是否有
函数。bind
并且不想使用第四个参数。是的,但是如果匿名函数的目标是在那里有一些小代码,那么它的语法开始变得过于复杂,额外的一对带有uz.bind(function(){})的相距很远的paren是关于我画线的地方,只是把函数放在了其他地方,但是它是有效的,如果语法不困扰你,那就去做吧。这是一个极好且非常彻底的答案。我使用的是精确的语法,以前不起作用,但现在起作用了。奇怪的另一个后续问题:您可以将匿名函数与视图本身上的委托事件一起使用吗?因此,我可以使用
events:{'click':'myMethod'}
,而不是使用
events:{'click':function(){console.log('whatever!')}
否,您不能这样做。您需要在视图实例中包含方法名称的字符串。
events
hash只是一个方便的/helper构造,它希望方法名是字符串,而不是实际的函数对象。阅读源代码以了解详细信息,主干网在
delegateEvents
期间所做的事情非常简单。哦,我知道它是如何工作的。我想我的问题更像是有没有一个方便的方法来解决这个问题?我不想过多地处理委托事件,但另一方面,我并不认为我的视图需要60个方法。