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

Undefined variable when converting a ternary operator into traditional if statement

我正在使用 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。这个转换哪里出错了?

在原始代码中,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而不是其他各种虚假值,但情况似乎并非如此在该代码中,只是 if (!doUpdate) 而不是 if (doUpdate === false) 是通常的方式。

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

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

我对我的 Backbone 有点生疏,但据我所知,不可能将 `Backbone.Events.trigger 与函数一起用作参数。你 可以 但是把它变成一个 iife(或者让它成为一个命名函数)。

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

    return "bar";
}()));

或作为命名函数

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

    return "bar";
}

self.trigger(getUpdateEventName(doUpdate));