84669인 학습
152542인 학습
20005인 학습
5487인 학습
7821인 학습
359900인 학습
3350인 학습
180660인 학습
48569인 학습
18603인 학습
40936인 학습
1549인 학습
1183인 학습
32909인 학습
看到下图这样的代码,不明白地方有三个:
第一个function前为什么要用感叹号?意思是把第一个函数的返回值强制转为布尔值吗?可以又没有赋值操作,转换成布尔值应该没有意义吧?
第二个函数和后面的函数都用~,这是同位取反?也是没有赋值,这样用是为什么?
~
每个匿名函数之间用逗号隔开,这是为什么?一般也是赋值的时候才用到逗号分隔吧?
闭关修行中......
因为声明式定义函数立即执行,解析器是无法理解的,要把声明式转化为函数表达式才能让解析器解析成功,常用的是添加(),其实添加!+-~也是可以的:
!+-~
function (a){console.log(a)}('it work!') // error 解析器无法理解,不会调用函数 (function (a){console.log(a)})('it work!') // it work! 匿名函数被调用 !function (a){console.log(a)}('it work!') // it work! 匿名函数被调用 +function (a){console.log(a)}('it work!') // it work! 匿名函数被调用 -function (a){console.log(a)}('it work!') // it work! 匿名函数被调用 ~function (a){console.log(a)}('it work!') // it work! 匿名函数被调用
逗号就是连续执行多个匿名函数
~function (a){console.log(a)}('it work!'),~function (a){console.log(a)}('it work!') // it work! it work! 匿名函数被调用
首先,问题的关键在于理解三个操作符,分别是:
一元运算符中的逻辑非运算符(!)和按位非运算符(~)
圆括号操作符
逗号操作符
在本例中,首先声明函数的一般形式为:
function [name]([param1[, param2[, ..., paramN]]]) { statements }
而如果省略掉这个[name],就变成了匿名函数。但是匿名函数单独写的话就会报错:
[name]
为了让它成为合法的表达式,这时就需要一元运算符了:
这时这个表达式就合法了。但是这时它还只是一个静态的表达式,而我们的目的是直接运行内容求值,所以就需要圆括号操作符,变成~function(){}()这种形式。而如果需要很多个批量写呢,再加上逗号操作符,变成:
~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... }
楼上的说的都挺好,我个人认为: 这就是IIFE的一种形式。
楼主可以查看一下相关知识。
因为声明式定义函数立即执行,解析器是无法理解的,要把声明式转化为函数表达式才能让解析器解析成功,常用的是添加(),其实添加
!+-~
也是可以的:逗号就是连续执行多个匿名函数
首先,问题的关键在于理解三个操作符,分别是:
一元运算符中的逻辑非运算符(!)和按位非运算符(~)
圆括号操作符
逗号操作符
在本例中,首先声明函数的一般形式为:
而如果省略掉这个
[name]
,就变成了匿名函数。但是匿名函数单独写的话就会报错:为了让它成为合法的表达式,这时就需要一元运算符了:
这时这个表达式就合法了。但是这时它还只是一个静态的表达式,而我们的目的是直接运行内容求值,所以就需要圆括号操作符,变成
~function(){}()
这种形式。而如果需要很多个批量写呢,再加上逗号操作符,变成:这样就是题中的形式了。
和用括号括起来的作用一样。
直接写一个匿名函数是会报错的,必须要将它转成可识别的函数体再运行。
你甚至可以这样:
只要让它能够在一个作用域上就可以了
至于逗号,这是通用语法,for循环里面不是总能看见的么
楼上的说的都挺好,我个人认为: 这就是IIFE的一种形式。
楼主可以查看一下相关知识。