您的位置:首页 > 其它

自执行or立即调用函数

2015-11-16 23:08 183 查看
在这里,我个人比较偏向于用立即调用函数的说法

问题:为什么有的可以执行,有的不能执行呢?

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执行并返回undefined
void function () {}()


那么它能干嘛?匿名函数+闭包!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息