JS匿名函数

2016-02-20 01:13 5 1 收藏

生活已是百般艰难,为何不努力一点。下面图老师就给大家分享JS匿名函数,希望可以让热爱学习的朋友们体会到设计的小小的乐趣。

【 tulaoshi.com - Web开发 】

毫无疑问,John Resig 是一个细致且善于思考的人,对于我们通常使用的匿名函数,在他的细究之下,也能挖掘出一些新的东西。通常情况下,当一个函数调用自身时,递归就出现了,对于下面这样的函数调用,我们并不陌生。

1.function yell(n){
2.       return n 0 ? yell(n-1) + "a" : "hiy";
3.}
4.alert( yell(4))//结果为:hiyaaaa;

单个函数看不出任何问题,如果我们使用匿名函数,并将其放置到一个对象内部,结果会怎样?

1.var ninja = {
2.         yell: function(n){
3.                 return n 0 ? ninja.yell(n-1) + "a" : "hiy";
4.         }
5.};
6.alert( yell(4))//结果为:hiyaaaa;

现在我们看不出任何问题所在,如果我们创建一个新的对象,从ninja 那里复制yell方法,情况就有所不同了。既然匿名函数在ninja 内部,那么该方法仍是对ninja对象yell方法的引用。如果我们重新定义ninja对象,问题就出现了。


01.var ninja = {
02.           yell: function(n){
03.                 return n 0 ? ninja.yell(n-1) + "a" : "hiy";
04.          }
05.};
06.var samurai = { yell: ninja.yell };
07.var ninja = {};
08.try {
09.       alert(samurai.yell(4);
10.} catch(e){
11.       alert("Uh, this isn't good! Where'd ninja.yell go?" );
12.}
13.//结果是:"Uh, this isn't good! Where'd ninja.yell go?"

如何解决该问题?如何使yell方法更可靠?最常见的方法是在ninja.yell方法内部使用this来改变ninja对象的所有实例,即:

1.var ninja = {
2.          yell: function(n){
3.                return n 0 ? this.yell(n-1) + "a" : "hiy";
4.         }
5.};

现在我们测试,将会得到我们需要的结果。这当然是一种方法,另外一种方法是给匿名函数命名,这看似矛盾,但的确能很好的工作,瞧:


01.var ninja = {
02.           yell: function yell(n){
03.                  return n 0 ? yell(n-1) + "a" : "hiy";
04.           }
05.};
06.alert((ninja.yell(4)) + "  Works as we would expect it to!" );
07.var samurai = { yell: ninja.yell };
08.var ninja = {};
09.alert( (samurai.yell(4))+ "  The method correctly calls itself." );

给匿名函数命名可以更进一层,对于正常的变量声明,我们也可以尝试这样做,如:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)


1.var ninja = function myNinja(){
2.        alert( (ninja == myNinja) + " This function is named two things - at once!" );
3.};
4.ninja();

运行上面的这个函数,在 IE中,我么看到的是:flase This function is named two things – at once!,在FF中我们看到的是:true This function is named two things – at once!。作者曾指出:匿名函数可以命名,但只在函数自身内部可见。看来并不是那么回事,测试结果表明,对于IE,并不可见,而在FF中,结果正如作者所料。同时,我们检测myNinja,结果在IE和FF也有所不同。


1.alert( typeof myNinja);
2.//在FF中为"undefinde"
3.//在IE中为"function"

这样看来,给匿名函数命名,在IE中,只在外部可见;在FF中,只在函数内部可见。其实,我们可以使用arguments.callee获得我们所需要的结果,如下:


1.var ninja = {
2.            yell: function(n){
3.                   return n 0 ? arguments.callee(n-1) + "a" : "hiy";
4.            }
5.};
6.alert( ninja.yell(4));

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

Arguments.callee是对于每一个函数都可以使用,它提供给我们一个可靠的方法去访问函数自身。本人觉得,该方法比较简洁可靠。

综上所述,所有这些方法对我们处理复杂的代码结构将大有裨益。选择使用可以使我们的代码结构更加简洁明了,这也许是作者的初衷。

来源:https://www.tulaoshi.com/n/20160220/1633508.html

延伸阅读
标签: Web开发
javascript不能支持函数的重载,如下: 代码如下: script language="JavaScript" function f(length) {     alert("高为:"+length); } function f(length,width) {     alert("高为:"+length+",宽为:"+width); } /srcipt 上面那段代码其实是行不通的,因为函数定义时...
标签: Web开发
/* JavaScript Document 广告代码静态化js通用函数 原则上每个页面不应该出现域名的固定指向 */ /* Config */ var sSiteUrl = "http://www.spvjoy.com"; //var sSiteUrl = "http://192.168.1.30:82"; var sSendSite = "http://send.mmstoon.com"; var sMp3Url = "...
标签: Web开发
前段时间在用google map api的函数库的时候,发现里面的downloadUrl函数非常好用,所以自己写了一个。用腻了那些什么框架什么池,到头来发现越简单的东西越是适合我这种懒人。 downloadUrl(url, callback, data); 参数说明: url不用说了; callback是回调函数,函数调用的时候会有两个参数:data, responseCode...
标签: Web开发
代码如下: script type="text/javascript"  /**   * function loadScript   * Copyright (C) 2006 Dao Gottwald   *   * This library is free software; you can redistribute it and/or&nbs...
标签: Web开发
公司的一个项目中,有许多地方需要延时执行一些可重复性的函数(动作),就写了下面这段函数。 呵呵,不知道取什么意思更为确切些,就定为了:LoopRun,意为“重复执行”  function lLoopRun(sFuncLoop,sFuncEnd,nDelay) {   var vintervalId = null;   var runString  =...

经验教程

893

收藏

81
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部