【问题标题】:Defining and using function in if condition在 if 条件下定义和使用函数
【发布时间】:2020-05-20 18:36:34
【问题描述】:

我需要一个 if 语句,其中条件取决于 try-catch 是否成功。定义一个新函数只是为了调用它一次是浪费空间,我宁愿找出一个单行。

我不能使用if (try{return true;}catch{return false;}),因为它会导致语法错误。因此,将“return false”视为“失败的 try-catch 尝试”。

这是我可以在它仍然有效的地方尽可能短。

// [WORKING] False as expected
if ((() => {return false})()){
    console.log("Condition is true");   
}
else{console.log("Condition is false");}

这对我来说很有意义,但我认为这不是最“官方”的方式。这种方式是一个好的解决方案吗?有没有更好的办法?

这对我来说有意义的原因是因为我正在检查变量是否存在,是否为数字类型并且大于 0。

if ((() => {try{return price > 0}catch{return false}})())

【问题讨论】:

  • 为什么?为什么不只执行函数的内容?我不明白需要在 if 执行时构造函数。
  • (1) 函数是真实的。 (2) 您在第二个版本中有一个隐式全局变量。 (3) 这是一个 xy 问题。你到底想做什么?
  • if ( (function(){ return true; }()) ) 将起作用。实际去做是没有意义的。
  • 一般来说,IIFE 是一种合理的方式来做这么短而做作的事情。在极少数情况下这会有意义——在别处创建你的函数并使其实际上可以推理代码。这仍然有 XY 问题的味道,因为它没有任何意义。
  • 让你的 JS 可读,你以后会感谢自己...

标签: javascript node.js


【解决方案1】:

if (try {return true;} catch {return false;}) 的问题在于您试图在函数之外使用return;那里没有意义。

正如所有 cmets 指出的那样,您可以按照第二个块的建议进行操作,这可能是获得这种行为的唯一合理方法。但是,正如 cmets 所指出的,这毫无意义。如果它足够小,可以放入典型的if-条件中的单行,那么它可能只是一个表达式,在这种情况下,您不妨只使用该表达式作为您的条件。

也就是说,而不是

if ((() => doSomething('with', 'my data'))()) {
  //...
} else 
  // ...
}

你也可以写

if (doSomething('with', 'my data')) {
  // ...
} else 
  // ...
}

如果它不是单个表达式,那么将它放在命名函数中并在 if-condition 中调用它会更有意义。

这不会施加额外的惩罚。该功能,无论是在您的条件下还是在它之外,都将占用相同数量的内存;当前范围结束时,它将有资格进行垃圾收集。 (我想条件中的那个可能会更早符合条件;但我不会指望它;这肯定不足以增加代码的复杂性。)

换句话说,这个:

const myFunc = (some, args) => {
  const step1 = doSomething('with' args);
  const step2 = doAnotherThing('with', step1, 'and', some, args);
  return doAThirdThing('with', step2)
}

if (myFunc('my', 'data')) {
  //...
} else {
  // ...
}

更简洁,更易读
if (((some, args) => {
  const step1 = doSomething('with' args);
  const step2 = doAnotherThing('with', step1, 'and', some, args);
  return doAThirdThing('with', step2)
})('my', 'data')) {
  //...
} else {
  // ...
}

我向你保证,以后你会感谢自己没有做后者。

【讨论】:

  • 代码分离是一个比试图将所有内容都放在“一行”更好的解决方案
猜你喜欢
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 2017-09-29
相关资源
最近更新 更多