js 函数 return false 跳出外部函数,怎么写?

function a(){
   if(true)
       return false;
}

这是没有任何问题的,如果我改成这种

function Test(){
   a();
   b();
   c();
}

js 函数a() return false 跳出外部函数Test(),怎么写?

阅读 7.6k
7 个回答

return 只能退出当前函数,不具备跨函数的功能。但是 throw 具有不限层次中断的功能,所以这个需要可能需要使用 throw 来完成。

一般情况下 throw 应该抛出一个 Error 对象。但是 JavaScript 并未对 throw 的对象有所有限制,所以也可以抛出其它东西,在确实不需要抛出错误的情况下,抛出一个状态对象,甚至值都是可以的。但不管抛出什么,要想外面的程序能正常运行,都是需要 try ... catch 的。

举例:

function a() {
    console.log("[Trace] a()");
    if (true) {
        throw "true-as-false";
    }
}

function b() {
    console.log("[Trace] b()");
}

function c() {
    console.log("[Trace] c()");
}

function test() {
    try {
        a();
        b();
        c();
    } catch (stat) {
        if (stat === "true-as-false") {
            return;
        }

        // TODO 其他情况正常处理可能发生的错误
    }
}

test();

只会输出 [Trace] a(),因为被 throw 给中断掉了。

如果是有一堆判断函数,只要有一个 flase 就退出,那就可以用数组来处理,比如

const fns = [
    () => { console.log(true); return true; },
    () => { console.log(true); return true; },
    () => { console.log(false); return false; },
    () => { console.log(true); return true; },
];

fns.every(fn => fn());
// true
// true
// false

只要遇到一个返回 false 的就结束了(注意,返回 undefined,也就是无返回值 …… 也表示 false)

function Test(){
   a() && b() &&  c();
}
  1. throw error 不过需要外部捕获下
  2. 在abc外边接受返回值 为false则在test里继续return
// 这样也可以
function Test(){
   if(!a()) return;
   b();
   c();
}
function Test(){
   c() ? a() b() : return
}

promise改调用链 + exception

把所有方法放入数组,通过数组的every方法来判断是否有错误,中断跳出
function a(){
    console.log('a');
  if (true) {
      return false;
  }
}
function b() {
    console.log('b');
}
function c() {
    console.log('c');
}
const arr = [a, b, c];
function Test() {
    const noErr = arr.every(fn => fn());
    if (!noErr) {
        return false;
    }
}
Test()
推荐问题
宣传栏