【问题标题】:JavaScript plus sign in front of function expression函数表达式前面的 JavaScript 加号
【发布时间】:2012-10-31 18:11:08
【问题描述】:

我一直在寻找有关立即调用函数的信息,在某个地方我偶然发现了这种表示法:

+function(){console.log("Something.")}()

有人可以向我解释一下函数前面的+ 符号是什么意思吗?

【问题讨论】:

标签: javascript function operators iife self-invoking-function


【解决方案1】:

它强制解析器将+ 之后的部分视为表达式。这通常用于立即调用的函数,例如:

+function() { console.log("Foo!"); }();

如果没有 + 那里,如果解析器处于等待语句的状态(可以是表达式或多个非表达式语句),则单词 function 看起来像函数的开头 declaration 而不是函数 expression ,因此它后面的()(上一行末尾的那些)将是语法错误(缺少名称也是如此,在那个例子中)。 使用+,它使它成为一个函数表达式,这意味着名称是可选的,并导致对该函数的引用,该函数可以被调用,因此括号是有效的。

+ 只是其中一种选择。它也可以是-!~,或者任何其他一元运算符。或者,您可以使用括号(这更常见,但在语法上既不正确也不正确):

(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());

【讨论】:

  • 更多细节在这里,benalman.com/news/2010/11/…
  • 我们不能说paren-wrapping是一种优越的符号吗?我非常熟悉用于包含表达式的括号。如果您还不知道 js 的这个神秘怪癖,那么在这种情况下 + 正在做什么就完全不清楚了。
  • 注意:在两个括号选项中,jsLint 更喜欢第二个。我认为 jsHint 不那么挑剔。
  • 使用“加号”符号的常用库之一是Bootstrap(这就是我最终阅读此主题的方式)。
  • Bootstrap 正在这样做,顺便说一句:maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.js
【解决方案2】:

作为@TJCrowder 答案的补充,+ 通常用于强制对值as this SO answer explains 进行数字转换。在这种情况下,它被称为“一元加运算符”(为了便于搜索)。

var num = +variant;

所以在函数前面,它可以是一种强制将函数的结果解释为数字的方法。我怀疑它是否会发生,但理论上 JIT 可以使用它来将函数编译为仅限数字的函数等。但是,为了防止在更大的表达式中使用一元加号作为连接,您需要括号:

blah + (+(function(){ var scope; return "4"; })());

【讨论】:

  • 这是如何获得 37 票的? (+function() { ... })() 表示法永远不会在没有错误的情况下执行(除了这不能回答问题的事实)。
  • @whitequark:在函数+调用周围错过了一对大括号。由于数字转换解释,怀疑赞成票更多。
  • 好吧,我可能一直在吹毛求疵。
  • @Christoph 我倾向于将这些括号留在那里。事实上,如果它们丢失了,我什至会添加它们。它使发生的事情更加清楚,并且还可以通过删除空格来防止代码最小化时出现问题,从而导致 3++function... 不一样。
  • 尽管经过进一步思考,+function... 本身是不必要的。使用blah + function( ){ ... }( ); 可以得到相同的结果,这将不需要包装括号。
【解决方案3】:

所以简短的回答是,它通过以一种或另一种方式使用函数结果来防止语法错误。

您还可以使用void 运算符指示引擎您甚至对返回值都不感兴趣:

void function() { console.log("Foo!"); }();

当然,在整个东西周围加上大括号也可以达到这个目的。

【讨论】:

  • 空格或括号非常更可取。它们不含 WTF。使用 + 是一种不太聪明的聪明。
  • 好点。似乎使用其中一个运营商会违反目前的行业标准。也许“酷孩子”开发人员会选择它,否则我仍然没有看到使用某些东西而不是 void 或 ()
【解决方案4】:

解决方案和起源

函数前的+ 符号实际上称为Unary plus,是称为Unary Operators 的组的一部分,并且(一元加号)用于将字符串和其他表示形式转换为数字(整数或浮点数)。

一元运算是只有一个操作数的运算,即单个 输入。这与二元运算相反,二元运算使用两个 操作数

基本用途:

const x = "1";
const y = "-1";
const n = "7.77";

console.log(+x);
// expected output: 1

console.log(+n);
// expected output: 7.77

console.log(+y);
// expected output: -1

console.log(+'');
// expected output: 0

console.log(+true);
// expected output: 1

console.log(+false);
// expected output: 0

console.log(+'hello');
// expected output: NaN

+ 符号位于变量、函数或任何返回的字符串表示之前,输出将被转换为整数或浮点数;一元运算符 (+) 也转换非字符串值 truefalsenull

高级用途

使用您上面提到的功能的正确方法是:

+function(){return "3.141"}()
// expected output: 3.141

我喜欢使用+new Date() 对象转换为时间戳,如下所示:

+new Date()
// expected output: 1641387991035

其他一元运算符

- 一元否定运算符将其操作数转换为数字类型 然后否定它。

~按位非运算符。

! 逻辑非运算符。

delete delete 操作符从一个对象中删除一个属性。

void void 运算符丢弃表达式的返回值。

typeof typeof 运算符确定给定对象的类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 2023-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多