当没有条件为真时,如何避免返回函数返回“undefined”

时间:2017-05-22 15:38:42

标签: javascript

我在另一个函数中使用getFooBar(x, y),并希望根据条件执行foo()bar()。如果它们都不是true:什么都不做。

但JS并不喜欢这样。它总会返回一些东西,在这种情况下它是undefined

有可能阻止这种情况吗?

getFooBar(x, y) {

    if (x > y) {
        return foo();
    }
    if (y > x) {
         return bar();
    }
}


foo() {
     // do stuff.
}

bar() {
     // do some other stuff.
}

2 个答案:

答案 0 :(得分:1)

如果你不想要undefined,你需要确保你的函数无论如何被调用都会返回一些东西。

您需要测试参数是否存在。您可以通过检查内置的arguments对象的length属性来执行此操作。

您还应验证参数的类型是否正确(我假设您正在考虑数字)。

顺便说一句,你的逻辑没有指定x === y时应该发生什么,所以除非你检查那个条件,否则函数不会返回任何内容然后当你尝试使用返回时价值,您将获得undefined

function getFooBar(x, y) {
    // Make sure both arguments were passed
    if(arguments.length === 2 && typeof x === "number" && typeof y === "number"){    
      if (x > y) {
        return foo();
      }
    
      if (y > x) {
         return bar();
      }
    } else {
      // One or both arguments are missing.
      // You can do whatever you like here.
      // In this example, it will return a failure message,
      // but, you could simply use return with no value.
      return "invalid function call";
    }
}


function foo() {
     // do stuff.
     return "foo";
}

function bar() {
     // do some other stuff.
     return "bar";
}

console.log(getFooBar());
console.log(getFooBar("Tuesday", "Purple"));
console.log(getFooBar(5,5));  // No condition tests for equal arguments, so no value is returned

// This time we'll check to see if there is a value to work with before assuming it's there:
var result = getFooBar(5,5);
if(result){
  console.log(result);
} else {
  console.log("getFooBar(5,5) doesn't return a value.");
}

console.log(getFooBar(5,10));
console.log(getFooBar(10,5));

答案 1 :(得分:0)

您可以添加空的return语句,也可以返回虚假值,例如null0undefined或任何您想要的内容。此外,即使它返回undefined,您仍然可以捕获返回的未定义值并对其执行某些操作,就像非返回函数一样。因此,您要么选择接受并使用undefined返回值,要么写出您自己的返回值,无论何种类型。

getFooBar(x, y) {

    if (x > y) {
        return foo();
    }
    if (y > x) {
         return bar();
    }

    return "foobar";
}


foo() {
     // do stuff.
}

bar() {
     // do some other stuff.
}