资源描述:
《深入研究javascript的匿名函数》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、深入研究JavaScript的匿名函数jQuery片段:(function(){//这里忽略jQuery所有实现})();(function(){//这里忽略jQuery所有实现})(); 半年前初次接触jQuery的时候,我也像其他人一样很兴奋地想看看源码是什么样的。然而,在看到源码的第一眼,我就迷糊了。为什么只有一个匿名函数又没看到运行(当然是运行了……),就能有jQuery这么个函数库了?于是,我抱着疑问来到CSDN。结果相信现在很多人都很清楚了(因为在我之后也不乏来者,呵呵~)。当一个匿名函数被括
2、起来,然后再在后面加一个括号,这个匿名函数就能立即运行起来!真神奇哦! 嘿嘿!胡闹到此为止。在这一节,我们碰到的jQuery片段是一组立即运行的匿名函数。而这种用法在论坛上也曾引起过激辩——这段代码究竟属不属于闭包呢?带着这个疑问,我们从基础开始,分析每个关键要素,寻找属于自己的答案。(没错,自己的答案!在我看来,所有理论只是形式,只要它有利于我们的应用实现,就是可取的——黑猫白猫,抓到老鼠的就是好猫!) 要说匿名函数,我们首先要由函数本身说起。函数的定义如下:函数是将唯一的输出值赋予给每一输入的“法则
3、”。 当然,这只是数学上的定义。但是,在计算机编程语言中,函数的定义也八九不离十。因为,我们都知道,计算机中的函数,也类似数学定义中的描述,它是将输入的若干数据,经过代码设定的逻辑操作处理后,返回唯一的输出的一组代码组合块。——当然,特例是,输入的数据为空或输出的数据为空,或者两者都为空。 下面,我们先初步了解一下和匿名函数相关的概念。函数声明(function语句) 要使用一个函数,我们就得首先声明它的存在。而我们最常用的方式就是使用function语句来定义一个函数,如:functionabc()
4、{//codetoprocess}functionabc(){//codetoprocess} 当然,你的函数也可以是带参数的,甚至是带返回值的。functionabc(x,y){returnx+y;}functionabc(x,y){returnx+y;} 但是,无论你怎么去定义你的函数,JS解释器都会把它翻译成一个Function对象。例如,你在定义上面的其中一个例子的函数号,再输入如下代码:alert(typeof(abc));//"function" 你的浏览器就会弹出提示框,提示你abc是一
5、个Function对象。那么Function对象究竟是什么呢?Function对象 Function对象是JavaScript里面的固有对象,所有的函数实际上都是一个Function对象。关于这个方面的讨论,我们留到下一个专题节。我们先看看,Function对象能不能直接运用构造函数创建一个新的函数呢?答案是肯定的。例如:varabc=newFunction("x","y","returnx*y;");alert(abc(2,3));//"6"varabc=newFunction("x","y","ret
6、urnx*y;");alert(abc(2,3));//"6" 相信大家现在对如何声明一个函数应该是有所了解了。那么什么才是匿名函数呢?声明匿名函数 顾名思义,匿名函数就是没有实际名字的函数。例如,我们把上面的例子中,函数的名字去掉,再判断一下他是不是一个函数:alert(typeoffunction(){});//"function"alert(typeoffunction(x,y){returnx+y;});//"function"alert(typeofnewFunction("x","y","r
7、eturnx*y;"))//"function"alert(typeoffunction(){});//"function"alert(typeoffunction(x,y){returnx+y;});//"function"alert(typeofnewFunction("x","y","returnx*y;"))//"function" 我们可以很容易地看到,它们全都是Function对象,换言之,他们都是函数,但是他们都有一个特点——没有名字。所以我们把他们称作“匿名函数”。然而,正因为他们没有“名
8、字”,我们也没有办法找到他们。这就引申了如何去调用一个匿名函数的问题了。匿名函数的调用 要调用一个函数,我们必须要有方法定位它,引用它。所以,我们会需要帮它找一个名字。例如:varabc=function(x,y){returnx+y;}alert(abc(2,3));//"5" 上面的操作其实就等于换个方式去定义函数,这种用法是我们比较频繁遇到的。例如我们在设定一个DOM元素事件处理函数的时候,我们通常都不