我在这里浏览了一段代码http://cssdeck.com/labs/bjiau4dy,我在Javascript框中看到了这个 -
!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!
那有什么作用?为什么它不会在控制台中抛出错误?
谢谢!
我在这里浏览了一段代码http://cssdeck.com/labs/bjiau4dy,我在Javascript框中看到了这个 -
!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!
那有什么作用?为什么它不会在控制台中抛出错误?
谢谢!
这些符号中的任何一个都将其后面的函数转换为函数表达式,而不是函数声明。把它们放在一起只是为了好玩。
()
如果您尝试通过在声明之后放置来调用常规函数:
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
更详细地说,这些运算符中的每一个实际上都会对执行它的操作数执行类型强制。+
将其后面的操作数转换为 a number
,-
运算符也是如此。!
是非运算符,并将操作数转换为boolean
(真/假)。
要记住的另一件事是,在 Javascript 中,所有内容都可以评估为某种值。这可能是一个“真”或“假”值,也可以有一个“数字”值(即使该值不是数字,AKA NaN
)。
因此,如果您打开 JSFiddle 或 Firebug,并弄乱这些值对函数的作用,您会看到它们也会产生某种新的返回值。
例如:
!function(){}
将评估为值false
(因为将函数对象强制为布尔值会产生 值true
)。+function(){}
将评估为NaN
(因为将函数对象强制为数字产量NaN
)。使用 可以看到相同的结果-
。!+function(){}
产生真(强制多个值NaN
将产生false
而不是假产生真。!+-+-+!function(){}
!function(){}
产生真(因为yield false
,+false
yield0
和将继续贯穿所有这些+
和-
运算符,直到 finally!0
被评估为真)。false
应用示例中列出的运算符将在, -1, 0, 1之间来回切换,true
直到所有运算符都被评估。请注意,我使用 Firebug 检查了这些。浏览器之间可能存在差异,也可能是 Firebug 在评估中向我们展示的内容。TL;DR 是 Javascript 执行大量类型强制,并且会以不同于声明的方式评估表达式。
除了作为风格水印之外,做一长串符号是零点的。
这组符号充当对后面函数的操作,但什么也不做。
在 JS 中,你可以写1
or +1 (one) or !1
(false) or !+1 (还是 false)。这只是作用于以下功能的一长串。
所以!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!1
不会抛出错误。它的价值false
虽然。
并且!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!function(){ ... }
只是执行函数并评估为 false (但无论如何都没有对值做任何事情)
但是,由于存在某些东西,它会将函数定义转换为操作并立即评估该函数。但只是+function(){ ... }
会做同样的事情。