Javascript 写生活的不同方式是什么?它们的用例是什么?

Javascript 写生活的不同方式是什么?它们的用例是什么?,javascript,function,iife,Javascript,Function,Iife,我已经开始读这本书了。第二章说写生活有不同的方式: !function (){}() ~function (){}() +function (){}() -function (){}() new function (){} 1,function (){}() 1&&function (){}() var i=function (){}() 作者说: 每种表现形式都有其独特的品质和优势 字节数越少,一些连接就越安全,每个字节都有效,每个字节都有效 可执行文件 我是JS

我已经开始读这本书了。第二章说写生活有不同的方式:

!function (){}() 
~function (){}() 
+function (){}() 
-function (){}()
new function (){} 
1,function (){}() 
1&&function (){}() 
var i=function (){}()
作者说:

每种表现形式都有其独特的品质和优势 字节数越少,一些连接就越安全,每个字节都有效,每个字节都有效 可执行文件

我是JS的新手。我知道什么是生命,但这些生命形式到底是做什么的

为什么要这样做? 在我们进入列表之前,让我们先从“为什么要这样做?”

答案是:将函数中的任何变量和函数声明保持为私有。通常这是为了避免全局性(避免全局性是一个好主意)。例如:

由于IIFE(在本文中称为作用域函数),
foo
answer
不是全局变量。它们对于函数中的代码是私有的,除非它们以某种方式导出

即使不是在全球范围内,您也可以这样做,只是为了避免污染您所在的任何范围

IIFE通常还有其他用途,但您引用的样式通常用于范围界定

例子 作者戏剧性地夸大了“每个人都有自己独特的品质和优势”的说法

除非您使用的是返回值,否则这些值完全相同:

!function (){}() 
~function (){}() 
+function (){}() 
-function (){}()
1,function (){}() 
1&&function (){}() 
其中的代码在函数中运行,作用域在函数中

我们也可以将这些添加到该列表中:

(function(){}())
(function(){})()
0||function (){}() 
1^function(){}() // any binary math operator in place of ^ also works
当然,上述所有内容中的
1
并不特殊。对于大多数代码,可以是任意数字(或几乎任何其他数字),但使用
&
的代码不能与
0
null
未定义
NaN
false
一起使用(函数无法运行)。类似地,只要起始值为false,
0 | |…
的函数就可以工作

在这一项中:

var i=function (){}()
…唯一的区别是它声明了一个变量,
i
,用于存储返回值。当然,这可能是一个很大的不同。考虑这个更明显的版本:

var MyPseudoNamespace = function() {
    // ...

    return { /* nifty "namespace" stuff here */ };
})();
最后:

new function (){} 
它创建一个新对象,然后调用将
this
设置为新对象的函数。如果在函数中不使用
这个
,那么它完全没有意义。如果您这样做了,那么它是否有用取决于您如何使用


注意:如果有任何不受您控制的代码可能出现在范围函数之前(例如,当您合并和缩小文件时),最好用
关闭所有这些代码,例如:

;!function (){}() 
;~function (){}() 
;+function (){}() 
;-function (){}()
;1,function (){}() 
;1&&function (){}() 
;(function(){}())
;(function(){})()
;0||function (){}() 
;1^function(){}() // any binary math operator in place of ^ also works
其中有几家在技术上不需要一家,但大多数都需要。没有它们的副作用可能是微妙的,也可能是灾难性的。考虑:

代码之前的代码:

obj.prop = function() {
    // Do something big and awful
}
(function(){}())
然后您的代码:

obj.prop = function() {
    // Do something big and awful
}
(function(){}())
自动插入分号不会生效!结果如何?
obj.prop
函数被调用,我们的生命作为参数传递给它。这将使其更加明显:

obj.prop = function() {
    // Do something big and awful
}(function(){}())
看看那些
()
现在是如何调用函数的

同样地:

obj.criticalValue = 42
然后

突然,
criticalValue
被搞砸了。为什么?因为:

obj.criticalValue = 42+function(){}()


具有多个
是无害的,因此如果您从一个开始,就不太可能遇到麻烦。

将多个文件连接到一个文件中是一种优化。这里的想法是,如果上一个文件的最后一行没有用换行符结束,那么这个文件中的第一行在一行的中间开始。p>
添加诸如
之类的内容(function(){})(
几乎是同一件事@JamesThorpe,它是一对双胞胎,没有狗的锁,
(function(){}())
这些函数完全没有任何作用:-),更多信息,请参阅本博客:
void function(){}()
@batman
void
:“求值并返回
未定义的
”-The
(function(){})
表单如果前面有一个不带分号的非II函数表达式:
var f=function(x){console.log(“用x:+x调用”)/*新行,没有分号*(function(){console.log(“secondary”)}()
听起来像是一个奇怪的边缘案例,但我见过它在野外发生。寓意:如果你喜欢parethesis风格的IIFE,请始终使用分号(或者只是“始终使用分号”)。@joews:其中许多可能会导致意外的结果,因为前面的代码结尾不正确,而不仅仅是
(函数…
)。前导分号是一种很好的防御手段,例如,这就是我在缩小时经常做的。@joews:多亏了你出色的注释,我在结尾添加了一整件事。啊,当然!我以前没有考虑过操作符前缀。