backbone.js 将三元运算符转换为传统if语句时未定义变量

nwwlzxa7  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(118)

我正在使用eslint来修复我的 Backbone 应用程序中的一些编码标准。我在一个视图中有以下函数(简化代码):

getData: function(foo){
   var self = this;
   $.when(foo).then(function(){
      var doUpdate = false;

      self.makeAjaxRequest().done(function(data){
         self.trigger(doUpdate === false ? "foo" : "bar");
      });
   }
}

我需要将三元运算符转换为标准的if语句,所以我尝试了以下方法:

getData: function(foo){
   var self = this;
   $.when(foo).then(function(){
      var doUpdate = false;

      self.makeAjaxRequest().done(function(data){
         self.trigger(function(){
            if(doUpdate === false) {
               return "foo";
            }

            return "bar";
         });
      });
   }
}

不幸的是,它似乎在代码中引起了问题。我想知道我是否正确地引用了doUpdate。在这个转换中我哪里出了问题?

ecr0jaav

ecr0jaav1#

在原始程式码中,trigger会以"foo""bar"的值呼叫。
在更新后的代码中,trigger是通过函数 * 调用的 *。
您从未调用替换条件的函数。
我会保留条件版本,但是如果你想使用你的替代方法,call 你的函数:

getData: function(foo){
   var self = this;
   $.when(foo).then(function(){
      var doUpdate = false;

      self.makeAjaxRequest().done(function(data){
         self.trigger(function(){
            if(doUpdate === false) {
               return "foo";
            }

            return "bar";
         }());
//        ^^--------------- Note
      });
   }
}

但是,如果你需要删除条件句,我不会这样做,而是:

getData: function(foo){
   var self = this;
   $.when(foo).then(function(){
      var doUpdate = false;

      self.makeAjaxRequest().done(function(data){
         var triggerWith;
         if (doUpdate === false) {
            triggerWith = "foo";
         } else {
            triggerWith = "bar";
         }
         self.trigger(triggerWith);
      });
   }
}

旁注:除非你真实的的需要 * 特别 * 检查false,而不是其他各种虚假的值,这在代码中似乎不是这样的,否则通常的方法是if (!doUpdate)而不是if (doUpdate === false)

vd8tlhqk

vd8tlhqk2#

为什么不在调用self.trigger之前直接使用if子句呢?

self.makeAjaxRequest().done(function(data) {
    if (doUpdate) {
        self.trigger("bar");
    } else {
        self.trigger("foo");
    }
});
5fjcxozz

5fjcxozz3#

我对我的Backbone有点生疏了,但是我想用Backbone.Events.trigger作为一个函数的参数是不可能的。但是你 * 可以 * 把它变成一个life(或者把它变成一个命名函数)。

self.trigger((function(){
    if(doUpdate === false) {
        return "foo";
    }

    return "bar";
}()));

或作为命名函数

function getUpdateEventName(doUpdate) {
    if(doUpdate === false) {
        return "foo";
    }

    return "bar";
}

self.trigger(getUpdateEventName(doUpdate));

相关问题