自执行or立即调用函数

来源:互联网 发布:云计算服务的应用例子 编辑:程序博客网 时间:2024/05/19 16:22

在这里,我个人比较偏向于用立即调用函数的说法
问题:为什么有的可以执行,有的不能执行呢?

function(){console.log("执行啦")}()//Uncaught SyntaxError: Unexpected token (function foo(){console.log("执行啦")}()//Uncaught SyntaxError: Unexpected token (var foo = function foo(){console.log("执行啦")}()//执行啦function foo(){console.log("执行啦")}(1);//不会报错,但不执行相当于:function foo(){console.log("执行啦")}       (1)       //其实并没有做什么

后来看了汤姆大叔的一篇帖子,恍然大悟

函数声明:function foo() {}
函数表达式:var foo = function foo(){}

什么叫表达式?=>由数字、算符、数字分组符号(括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合。(从小学数学课我们就开始讲函数表达式啊!)

函数执行意味着什么?
意味着它得是一个式子才能执行啊!
函数声明是没有办法执行的!

重点在这里:
立即调用函数意味着立即执行的函数,意味着 表达式到执行
所以我们立即调用函数时,将函数用某些方法把它变成表达式!!

各种操作符是在函数表达式和函数声明上消除歧义,所以一旦解析器知道其中一个已经是表达式了,其它的也都默认为表达式了(function () { /* code */ } ()); // 推荐使用这个(function () { /* code */ })(); // 但是这个也是可以用的var i = function () { return 10; } ();//表达式true && function () { /* code */ } ();//用&&转换为表达式0, function () { /* code */ } ();//用,转换为表达式// 你甚至可以在function前面加一元操作符号转换为表达式!function () { /* code */ } ();~function () { /* code */ } ();-function () { /* code */ } ();+function () { /* code */ } ();// 还有一个情况,使用new关键字,也可以用,但我不确定它的效率new function () { /* code */ }new function () { /* code */ } () // 如果需要传递参数,只需要加上括弧()//当然,这个也是可以的,void执行并返回undefinedvoid function () {}()

那么它能干嘛?匿名函数+闭包!!

0 0
原创粉丝点击