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