Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带一元运算符的IIFE:真实世界用例_Javascript - Fatal编程技术网

Javascript 带一元运算符的IIFE:真实世界用例

Javascript 带一元运算符的IIFE:真实世界用例,javascript,Javascript,我们可以假装使用一元运算符作为一个生命,如下所示: +function(){ return 5; }();//5 -function(){ return 5; }();//-5 ~function(){ return 5; }();//-6 !function(){ return 5; }();//false 那么,这类IIFE是否存在真实的用例,或者我们应该通过使用一元运算符避免使用IIFE,而只使用真实IIFE: (function(){ retu

我们可以假装使用一元运算符作为一个生命,如下所示:

+function(){
   return 5;
}();//5


-function(){
   return 5;
}();//-5


~function(){
   return 5;
}();//-6


!function(){
   return 5;
}();//false
那么,这类IIFE是否存在真实的用例,或者我们应该通过使用一元运算符避免使用IIFE,而只使用真实IIFE:

(function(){
   return 5;
}()); //5

我的IDE对
+函数()
不满意:

JSLint和JSHint也是如此。最好避免这样的构造,因为:

  • 他们把读者弄糊涂了
  • 它们混淆了IDE和验证器
  • 您无法从这样的IIFE中返回任何有意义的内容(例如,对象,这是迄今为止最常见的用例)

对我来说,使用带运算符的IIFE的唯一好处是,如果我忘记使用尾随分号,则不会引起问题

(function(){
...
}()) //no semi-colon
(function(){
...
}());
但是如果我忘记使用尾随分号,那么使用不带运算符的IIFE将是一个问题

(function(){
...
}()) //no semi-colon
(function(){
...
}());
前面的代码将被解释为函数调用。(第一个IIFE是要调用的函数,第二个是参数)



因为在@georg答案中,在大多数用例中,这样的生命没有任何有意义的回报,所以我会选择将iLife与operator一起使用。

这绝对没有区别,因此,请使用您认为最漂亮的一个。使用一元运算符在返回结果时会有所不同,因此我认为编程一定很漂亮……所有这些代码都做了完全相同的事情:运行函数并丢弃结果。一元运算符(或周围的括号)是该运算符工作所必需的,但它们都做相同的事情。是的,在代码执行中没有一个运算符,但在字符长度中有一个运算符,一些缩微符实际上使用它,因为您使用!、+、-、保存了1个字符,你到底在说什么?我不知道为什么这被否决了。英语不完美,但答案是正确的:
(fn expr)
在JavaScript中可以根据ASI规则与前一行连接,这是危险的;一般来说,建议在用括号或方括号开头的行之前手动添加分号。在IIFEs的情况下,括号的唯一目的是强制函数表达式解析,而不是语句解析;在ASI环境中,使用一元运算符比parens更可靠地实现这一点。@ELLIOTTCABLE我猜这句话被否决了,“如果我忘记使用尾随分号,那不会引起问题”。使用令人困惑的、非标准的黑客来规避分号的需要似乎有点疯狂。这不是疯狂,丹,这是完美的标准做法。在大型JavaScript项目中查找仅包含一个单变量表达式的StatementListItems。(另外,请不要用“疯子”这样的词作为贬义词;它是能干的,而且相当糟糕。)(即使忽略您的语言,以及您对FunctionExpression产品的一元选择的不熟悉,您至少必须意识到,依赖ASI是我们行业的绝对标准做法?无论您个人是否选择使用ASI,选择使用ASI的人通常都会竭尽全力避免不必要的分号…th这并不是“疯狂”,而是努力实现代码风格的一致性,这在大型共享代码库中无疑是一件好事。)