Javascript 匿名函数及其代码模式原理

本文详细解析了匿名函数的不同调用方式及其背后的原理,并对比了正确的匿名函数调用模式与错误示例,帮助读者理解匿名函数的工作机制。

转自http://www.cnblogs.com/Lion5859/archive/2009/10/16/1584767.html

文章写的很好,对我启发很大

关于什么是匿名函数,及它带来的优势在本文就不深究了,先抛出一个常用的匿名函数:

( function (){alert( ' yo ' )})()
很多同学知道怎么用这种匿名函数,却或许并不明白为什么这样写就能够调用匿名函数。也许知道后面的圆括号是执 行前面的函数,而并不清楚前面的圆括号具有何种含义!本文将带你了解匿名函数的代码模式原理。

OK,先来看看更多匿名函数调用模式:

1 .
(
function (){alert( 1 );}())
2 .
(
function (){alert( 2 );})()
3 .
void   function (){alert( 3 );}()

以上3个都是正 确的,且在功能上都是等同的。

再来看下错误的书写方式:

4 .
function (){alert( ' yo ' )}()
上面这段代码会抛出语 法错误,这究竟是为什么呢?带着这个问题我们来看看秦歌给出的解答:
1.函数字面量:首先声明一个函数对象,然后执行它。
2.优先表达 式:由于Javascript执行表达式是从圆括号里面到外面,所以可以用圆括号强制执行声明的函数。
3.void操作符:用void操作符去执 行一个没有用圆括号包围的一个单独操作数。

好吧,先不管解答是否正确,我们把这些放到一边,再来看看函数声明的语法和函数表达式的语法 说明:
一、函数声明:
function  name([param[, param[, ... param]]]) {
   statements
}

这 里的函数名称name是不可以省略的。如果省略了函数名称就会报错。
这也合理解释了为什么直接写
function (){alert( ' yo ' )}
会出错? 因 为编译器当他是函数声明而代码中没有出现函数名称,结果可想而知

二、函数表达式:
function  [name]([param] [, param] [..., param]) {
   statements
}

函 数名称name可以被省略,省略name就是所谓的匿名函数。 说明一点:如果需要创建匿名函数,则必须给出一个函数表达式而非函数的显式 声明

现在我们可以做出更准确的解释:

1\2\3匿名函数代码模式只不过是通过括号或者void告诉编 译器,把function(){}当作函数表达式来解释罢了。这其中并没有那么复杂的优先级和void操作符原理。这只不过是一个简单的语法转换。

可 以想象,只要符合函数表达式的语法,我们就可以创建出N种匿名函数代码模式,比如

!! function (){
   alert(
' yo ' );
}()

+ function (){
   alert(
' yo ' );
}()

等 等等等……

这其中并没有更深层的奥秘,只是函数声明与表达式的区别,如果你还不理解,也许就是你想多了想复杂了。
我们现在学习 Javascript还没有特专业的培训安排与课程,编码能力的提升都是要靠自己平时的练习与积累。然而越是这样越容易忽略最基础的知识,最后把简单的问 题复杂化,不可取。更有些同学是抱着能够使用的态度学习Javascript,而并不去深究,知其然而不知其所以然,其实到最后能力并没有多大的提升…… 更不可取! 

 

转载于:https://www.cnblogs.com/wolongxzg/archive/2010/03/18/1689290.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值