【问题标题】:Why use NOT operator on anonymous function call? (a la Knockout 2.1.0) [duplicate]为什么在匿名函数调用中使用 NOT 运算符? (a la Knockout 2.1.0)[重复]
【发布时间】:2012-08-08 14:23:09
【问题描述】:

可能重复:
What does the exclamation mark do before the function?

如果您查看source code for KnockoutJS 2.1.0,您会在第 7 行看到类似这样的代码结构:

!function(factory) { ... }(factoryDefinition);

not 运算符导致此表达式的计算结果为 true 而不是 undefined,但何必呢?

【问题讨论】:

  • 是的,我的问题似乎与“感叹号”问题相同。抱歉,我在搜索中没有注意到它。
  • @CgodLEY:StackOverflow 的搜索在标点符号和其他符号方面表现不佳。有点帮助把它拼出来。
  • 你用它来激发函数的立即调用,让它看起来像一个表达式而不是语句。

标签: javascript iife


【解决方案1】:

因为如果你不做某事,那么它看起来就像一个语法错误:

function(factory) { ... }(factoryDefinition);

试试看。

有必要让解析器到达它期望表达式的位置,以便在该上下文中识别 function 关键字。否则,当解析器将function 视为语句中的第一个标记时,它需要一个简单的函数声明,并且后面不能跟带括号的参数列表。

有各种各样的选择,围绕着每一个都聚集了不同的意见。

【讨论】:

  • 我在 NodeJS 上尝试了以下表达式,看起来还不错,是我遗漏了什么吗? function(message){console.log(message)}('hello'); 结果:hello
  • @CgodLEY 这在我的节点控制台中不起作用...(输出为...
  • 不,Node 给了我一个语法错误。 (事实上​​,我在函数声明的左括号中得到它,因为没有函数名的函数声明是错误的。
  • 啊,我没有放分号,导致它以某种方式工作,试试这个:function(message){console.log(message)}('hello')
  • @CgodLEY:您可能应该认为这是 REPL 中的一个错误。它不适用于您的正常代码。
【解决方案2】:

这是形成立即执行的函数表达式的简洁方式。

传统上,人们使用这两种形式

(function(){ }()); // Recommended by Crockford
(function(){ })(); // What most people use

如果你尝试只使用

function(){ }(); // Syntax error

这将是一个语法错误,因为它被解释为函数声明而不是表达式。这就是为什么您需要将函数括在括号中的原因。

但是,如果您在函数声明之前放置一元运算符,则不必添加正括号,并且它会删除代码的一个字符,这是一个(非常)微小的性能优势。有几个一元运算符可用于同一目的

!function(){ }();
~function(){ }(); 
-function(){ }(); 
+function(){ }(); 

【讨论】:

    猜你喜欢
    • 2018-06-07
    • 2014-09-11
    • 2018-09-26
    • 2011-07-21
    • 2013-10-31
    • 2019-04-10
    • 1970-01-01
    • 2011-01-21
    • 2011-06-09
    相关资源
    最近更新 更多