javascript - 在 JavaScript 中,!function(){}() 相对于 (function () {})() 的优势是什么?

标签 javascript design-patterns iife

<分区>

Possible Duplicate:
What does the exclamation mark do before the function?

我长期以来一直在 JavaScript 中使用以下代码来实现自执行的匿名函数:

(function () { /* magic happens */ })()

最近,我开始看到更多以下模式的实例(例如,在 Bootstrap 中):

!function () { /* presumably the same magic happens */ }()

有人知道第二种模式的优点是什么吗?或者,这只是一种风格偏好?

最佳答案

这两种不同的技术具有功能性 difference以及外观上的差异。一种技术相对于另一种技术的潜在优势将归因于这些差异。

简洁

Javascript 是一种简洁 非常重要的语言,因为 Javascript 在页面加载时下载。这意味着 Javascript 越简洁,下载时间越快。为此,有 Javascript minifiersobfuscators压缩 Javascript 文件以优化下载时间。例如,alert ( "Hi") ; 中的空格将被优化为 alert("Hi");

牢记这一点,比较这两种模式

  • 正常 closure : (function(){})() 16 个字符
  • Negated闭包:!function(){}() 15 个字符

这充其量只是一个微优化,所以我不认为这是一个特别有说服力的论点,除非你正在做 code golf。比赛。

取反返回值

比较ab的结果值。

var a = (function(){})()
var b = !function(){}()

由于 a 函数不返回任何内容,因此 a 将是 undefined。由于 undefined 的否定是 trueb 将计算为 true。这对于那些想要否定函数的返回值或拥有一切都必须返回非空值或未定义值迷信的人来说是一个优势。您可以在 other Stack Overflow question. 上查看其工作原理的解释。

我希望这能帮助您理解这个通常被视为 anti-pattern 的函数声明背后的基本原理。 .

关于javascript - 在 JavaScript 中,!function(){}() 相对于 (function () {})() 的优势是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7586870/

相关文章:

javascript - 对主题使用 mergeMap() 会忽略我正在合并的可观察对象上的 takeWhile()

c# - C# 中的数据继承

php - 评估记录中的 Twig 函数

javascript - 将变量从一个 IIFE 传递到另一个

javascript - Tipue search + Jekyll = jQuery.Deferred 异常 : $(. ..).tipuesearch 不是函数

javascript - Window.onsvgload 未在 ajax 加载的文件中触发

javascript - 在 node.js (Windows) 中对 IIFE 的奇怪观察

swift - Swift 中 IIFE 的类型推断

java - firefox a href# 符号导致 setter 不被调用

spring - 构建特定于上下文(消费者客户端)的spring应用程序