将三元运算符转换为传统 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));
我正在使用 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));