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

时间:2016-11-03 10:23:15

标签: javascript variables backbone.js eslint ternary

我正在使用eslint修复我的骨干应用程序中的一些编码标准。我在视图中有以下功能(简化代码):

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。我在这次转换中哪里出错了?

3 个答案:

答案 0 :(得分:3)

在原始代码中,使用值trigger"foo"调用"bar"

在更新后的代码中,trigger被称为,其功能为

你从未调用过用条件替换条件的函数。

我会保留条件版本,但是如果您想使用替代方案,调用您的函数:

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而不是其他各种虚假值,这在该代码中似乎不是这样,只是<{1}}而不是if (!doUpdate)是通常的方式。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

我的Backbone上有点生疏,但是不可能使用带有函数作为参数的`Backbone.Events.trigger。你可以然后把它变成一个生命(或使它成为一个命名函数)。

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

    return "bar";
}()));

或作为命名函数

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

    return "bar";
}

self.trigger(getUpdateEventName(doUpdate));