我在这里查看了一段代码http://cssdeck.com/labs/bjiau4dy,我在Javascript框中看到了这一点 -
!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!
那是做什么的?为什么它不会在控制台中抛出错误?
谢谢!
答案 0 :(得分:4)
这些符号中的任何一个都将其后面的函数转换为函数表达式,而不是函数声明。将它们放在一起只是为了好玩。
如果您尝试通过在声明后放置()
来调用常规函数:
function () {
// this is a syntax error...
}();
你会收到语法错误:
SyntaxError:意外的令牌(
因为你不能调用函数声明。
因此人们通常在括号中包含一个匿名函数,将其转换为函数表达式:
(function () {
// this will execute immediately
}());
你可以在这些符号之前做同样的事情:
!function () {
// this will also execute immediately
}();
有关详细信息,请参阅此处:http://kangax.github.com/nfe/#expr-vs-decl
答案 1 :(得分:0)
除了作为风格水印之外,做一长串符号是没有意义的。
这组符号作为后续函数的一个操作,但什么都不做。
在JS中你可以写1
或+1(一)或!1
(假)或!+(仍为假)。这只是对以下功能起作用的长链。
所以!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!1
不会抛出错误。它的值是false
。
!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!function(){ ... }
只执行该函数并计算为false(但无论如何都没有对该值进行处理)
然而,因为某些东西,它将函数定义转换为操作并立即评估函数。但只是+function(){ ... }
会做同样的事情。
答案 2 :(得分:0)
为了详细说明,这些运算符中的每一个都会在操作数上执行类型强制。 +
会将其后的操作数转换为number
,-
运算符也是如此。 !
是not运算符,会将操作数转换为boolean
(true / false)。
要记住的另一件事是,在Javascript中,一切都可以评估某种价值。这可能是一个“真实”或“虚假”的值,也可能有一个“数字”值(即使该值不是数字,AKA NaN
)。
因此,如果你打开JSFiddle或Firebug,并弄乱这些值对函数的作用,你会发现它们也会产生某种新的返回值。
例如:
!function(){}
将计算为false
的值(因为将函数对象强制转换为布尔值会产生true
的值)。 +function(){}
将评估为NaN
的值(因为将函数对象强制转换为数字会产生NaN
)。使用-
。!+function(){}
产生true(强制使用一些值NaN
将产生false
而不是false产生true。!+-+-+!function(){}
结果为真(因为!function(){}
产生false
,+false
产生0
,并将继续遍及所有+
和{ {1}}运算符直到最后-
被评估为真)。!0
,-1,0,1,false
之间来回切换,直到所有运算符都已经过评估。请注意,我使用Firebug检查了这些内容。浏览器之间可能存在差异,也许是Firebug在评估时向我们展示的内容。 TL; DR是Javascript执行大量类型强制,并且将以不同于声明的方式评估表达式。