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

Undefined variable when converting a ternary operator into traditional if statement

本文关键字:语句 if 传统 未定义 变量 转换 运算符 三元      更新时间:2023-09-26

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

在原代码中,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与一个函数作为参数。但是,可以把它变成一个生命(或者使它成为一个命名函数)。

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

或作为命名函数

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