文章目录

经常使用一些括号语法,由于功能都知晓,所以没研究过,拿来就用,今天有空研究研究。

例:

1
2
3
4
//代码一
(function(x){console.log(x);}(1));
//代码二
(function(x){console.log(x);})(1);

这两段代码广为各大框架公司个人使用,功能如下

1
2
3
4
var method= function(x){
console.log(x);
};
method(1);

两段代码除了括号位置都一样,而且功能也一样,执行结果也一样。都是省略了定义的方法直接执行。

说明:写这篇文章不考虑为什么这么写,不考虑性能等问题,只从合法性思考一下。

先看代码一

1
(function(x){console.log(x);}(1));
  1. 无疑的定义一个方法
1
function(x){console.log(x);}
  1. 后面加括号直接构造,带这么玩的吗?
1
function(x){console.log(x);}(1)
  1. java里面面像对像写法为 new Class(param);当然javascript里面也有点面像对像的思想。于是产生了代码三
1
2
//代码三
new function(x){console.log(x);}(1);
  1. 运行代码三试试,嘻嘻,成功,功能上和前两份代码一样。不过鬼都知道 new 的性能不好,所以代码三并不常见,回看代码一,大概能明白一些了
1
function(x){console.log(x);}(1)
  1. 想起这个 function method(x){console.log(x);};method(1);在js里面前面定义了一个method方法,后一句执行
    那这样个能否合并呢,前面 function(x){console.log(x)}为定义的function 后面的(1)为 function的参数?
    JS语法里面并没找到这一条,可以想像面向对像里面是否能不要new 就一个Class(param)来构一个类么。

  2. 在js里面function也是被实例化的一个对像,需要经过定义-实例化才能执行。现在已经定义了function,实例化咋整,看看完整代码,加了个括号

1
(function(x){console.log(x);}(1));
  1. 括号代表括号里是一个优先级高的运算,说到运算我又想起了new ,另外,我还想起了±!等。来改造下代码三,就出现了代码四五六
1
2
3
4
//代码四五六
+function(x){console.log(x);}(1);
-function(x){console.log(x);}(1);
!function(x){console.log(x);}(1);
  1. 运行一下,居然都可以成功,说明写法不止括号一种。由于有运算符号,所以前面定义的function就直接把后面的param拿进云进行运算了。javascript真神奇。
    写了这么多,如果用心看都应该明白了,现在再去看看代码二
1
(function(x){console.log(x);})(1);
  1. 可以看到前面的方法定义被括号括起来了,可以理解为new过一次么?试试

function(x){console.log(x)}  => SyntaxError: Unexpected token
(function(x){console.log(x);}) => function object

后面加了个(1) 相当于执行了这个function 传参1

OK,完事

文章目录