看到下图这样的代码,不明白地方有三个:
第一个function前为什么要用感叹号?意思是把第一个函数的返回值强制转为布尔值吗?可以又没有赋值操作,转换成布尔值应该没有意义吧?
第二个函数和后面的函数都用
~
,这是同位取反?也是没有赋值,这样用是为什么?每个匿名函数之间用逗号隔开,这是为什么?一般也是赋值的时候才用到逗号分隔吧?
看到下图这样的代码,不明白地方有三个:
第一个function前为什么要用感叹号?意思是把第一个函数的返回值强制转为布尔值吗?可以又没有赋值操作,转换成布尔值应该没有意义吧?
第二个函数和后面的函数都用~
,这是同位取反?也是没有赋值,这样用是为什么?
每个匿名函数之间用逗号隔开,这是为什么?一般也是赋值的时候才用到逗号分隔吧?
首先,问题的关键在于理解三个操作符,分别是:
在本例中,首先声明函数的一般形式为:
function [name]([param1[, param2[, ..., paramN]]]) {
statements
}
而如果省略掉这个[name]
,就变成了匿名函数。但是匿名函数单独写的话就会报错:
为了让它成为合法的表达式,这时就需要一元运算符了:
这时这个表达式就合法了。但是这时它还只是一个静态的表达式,而我们的目的是直接运行内容求值,所以就需要圆括号操作符,变成~function(){}()
这种形式。而如果需要很多个批量写呢,再加上逗号操作符,变成:
~function(){}(),
!function(){}(),
!function(){}();
这样就是题中的形式了。
和用括号括起来的作用一样。
直接写一个匿名函数是会报错的,必须要将它转成可识别的函数体再运行。
你甚至可以这样:
0==function(){console.log(1)}()
true && function(){console.log(1)}()
[function(){console.log(1)}()]
只要让它能够在一个作用域上就可以了
至于逗号,这是通用语法,for循环里面不是总能看见的么
for(var i=0, j=0; i<10, j<10; i++, j++) {
// code...
}
13 回答12.8k 阅读
7 回答1.9k 阅读
3 回答1.1k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
6 回答867 阅读✓ 已解决
6 回答1k 阅读
2 回答1.3k 阅读✓ 已解决
因为声明式定义函数立即执行,解析器是无法理解的,要把声明式转化为函数表达式才能让解析器解析成功,常用的是添加(),其实添加
!+-~
也是可以的:逗号就是连续执行多个匿名函数