我们应该避免/最小化在javascript流控制中使用return语句

时间:2017-07-13 15:03:47

标签: javascript

在我正在使用的当前软件中,我看到这种模式非常广泛,似乎他们试图尽可能地避免返回语句。即使在代码中的某些地方,这也几乎是极端的。

我早就听说过应该尽量减少或避免回复陈述,但我不记得(或搜索)这一思路的确切原因或起源。我认为这是由于某些PL的某些性能影响。

我个人并不坚持这一点,因为它不会使代码可读,但是给它带来疑问的好处,我很好奇使用这种模式在性能方面是否有其优点。

if (err) {
    if (err.message) {
        message = err.message;
    } else {
        if (err.errorCode) {
            message = err.errorCode;
        } else {
            message = "Unknown error";
        }
    }
} else {
    message = "Unknown error.";
}
deferred.reject(message);

如果我决定,我会随便使用return语句来终止这样的序列:

if(!err || (!err.message && !err.errorCode)){
    deferred.reject("Unknown error.");
    return;
}

if(err.message){
    deferred.reject(err.message);
    return;
}

if(err.errorCode){
    deferred.reject(err.errorCode);
}

第一种模式比第二种模式有优势吗?

1 个答案:

答案 0 :(得分:2)

您的代码示例也有昵称 - 圣诞树,而在实际项目中,支持此类代码非常困难。
例如你需要添加另一个条件 - 你会在现有的内部放置另一个if块,依此类推,这将是一场噩梦......结果,你将拥有一棵糟糕的树...

作为替代方案,您可以这样:

if (err) {
    if (err.message) {
        return err.message;
    }
    if (err.errorCode) {
        return err.errorCode;
    }
}
return "Unknown error.";

这样的代码看起来更简单,不是吗?
所以我真的相信将return用于此类目的是有道理的。

但是,我认为这里的要点是 - 不要松散一致性!在我们的示例中,我们始终返回相同数据类型相同业务逻辑的结果,例如:

if (err) {
    if (err.message) {
        return err;
    }
    // Here some stuff...
    // Few lines of code...
    //
    return -1;
}
// Another code...
//
if (!user) {
    return null;
}
// And somewhere in the end on anothere scrollin screen
//       
return user.email;

此示例返回objectnumbernullstring - 这是另一场噩梦......
在大型函数的实际项目中,由于回报很多,很容易得到这样的代码......
所以这里的回报率更低,再次因为它很容易支持......