我正在经历一段代码在这里http://cssdeck.com/labs/bjiau4dy,我看到这个Javascript代码箱 -什么这些字符做在Javascript
!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!
是什么呢?为什么它不会在控制台中抛出错误?
谢谢!
我正在经历一段代码在这里http://cssdeck.com/labs/bjiau4dy,我看到这个Javascript代码箱 -什么这些字符做在Javascript
!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!
是什么呢?为什么它不会在控制台中抛出错误?
谢谢!
任何这些符号都会将后面的函数转换为函数表达式,而不是函数声明。把他们放在一起只是为了好玩。
如果试图通过把()
声明之后调用普通函数:
function() {
// this is a syntax error...
}();
,你会得到一个语法错误:
SyntaxError: Unexpected token (
,因为你不能叫函数声明。
所以,人们通常包裹在括号中的匿名函数把它变成一个函数表达式:
(function() {
// this will execute immediately
}());
可以实现被前面加任何那些符号一样的东西:
!function() {
// this will also execute immediately
}();
欲了解更多信息,请参阅:http://kangax.github.com/nfe/#expr-vs-decl
除了作为风格水印之外,做长符号集有零点。
这组符号充当接下来的函数的操作,但什么都不做。在JS中,您可以编写1
或+1(one)或!1
(false)或!+1(仍然为false)。这只是那些对以下功能起作用的长链。因此!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!1
不会引发错误。但它的值是false
。
而且!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!function(){ ... }
只是执行的功能和计算结果为假(但没有与反正值来完成)
然而,因为东西是存在的,它把函数定义为操作和评估立即起作用。但只是+function(){ ... }
会做同样的事情。
再详细一点,每个这些操作符实际上都会对操作数进行类型强制操作。 +
将把它后面的操作数转换为number
,-
操作符也一样。 !
是非运算符,并将操作数转换为boolean
(true/false)。
要记住的另一件事是,在Javascript中,一切都可以评估某种价值。这可能是一个“真实”或“虚假”的值,也可能具有“数字”值(即使该值不是数字,也可以是“NaN
”)。因此,如果您打开JSFiddle或Firebug,并且弄乱这些值对函数的作用,您可以看到它们也会产生某种新的返回值。
例如:
!function(){}
将评估为的false
的值(因为胁迫的功能对象到布尔产生的true
的值)。+function(){}
将评估值为NaN
(因为强制函数对象的数字产生NaN
)。使用-
可以看到相同的结果。!+function(){}
产生真正的(胁迫一批价值NaN
将产生false
不虚产生true。!+-+-+!function(){}
产生true(因为!function(){}
产量false
,+false
产量0
,并且将继续在所有这些+
和-
运营商,直到最后!0
被评估为true)false
,-1,0,1,true
之间来回切换,直到所有运算符都被评估为止。请注意,我检查了这些使用Firebug。浏览器之间可能存在差异,也许Firebug向我们展示了评估内容。 TL; DR是Javascript执行大量类型的强制操作,并且将对表达式的评估与声明不同。