一家之言:谈谈JavaScript匿名函数(转)

匿名函数的概念大家也许不会陌生,但是我相信下面的内容会打开一些新的思路。

我们知道函数的定义方式有两种:

1 function fn1(){alert(‘fn1 works’);}

2 var fn2=function(){alert(‘fn2 works’);}

这两种方式有什么区别?思考一下…

1 第一种方式定义函数,函数声明过程在整个程序执行之前的预处理就完成了,所以只要处于同一个作用域,就可以访问到,即使在定义之前调用它也可以。

2 第二章方式就是匿名函数,这种方式函数只能按照程序流程执行到定义的那一行代码才被声明,所以只能在定义之后调用它。

举个例子

var fn1;

fn1();//报错

fn1=function(){

fn2();//fn2 works

alert(‘fn1 works’);

return false;

function fn2(){

alert(‘fn2 works’);

}

}

fn1();//fn2 works + fn1 works

我们看到fn2虽然处在return之后,程序流程并没有执行到它,但是它依然可以被使用,反之fn2只有在它被定义之后才会被正常执行。

明白了这个,下面看一看匿名函数在递归里用处

递归就是函数内部调用自己,举个例子

function fn1(n){
return n>2?fn1(n-1)+fn1(n-2):n;
}

当我们想把这个函数赋给其他的对象属性时,就要用到匿名函数,比如

obj1={

fn:function(n){

return n>2?obj1.fn(n-1)+obj1.fn(n-2):n;
}
}
obj2={
fn:obj.fn;
}
这个时候可以正常调用obj2.fn(),但是这里有一个隐患,我们必须保证obj1里的fn不能被覆盖,看下面的例子
obj1={}
obj2.fn();
obj1被清空,执行出错,怎么办,解决办法有很多,自己先想一个…
最容易的想到的是使用this,更改obj1里面fn的定义如下

obj1={

fn:function(n){

return n>2?this.fn(n-1)+this.fn(n-2):n;
}
}
这样即使obj1里的fn被改写也不影响obj2.fn(),但是this,你迷惑吗?
this在JavaScript里面绝对是一个难理解的概念,理解了最好,但是很多时候其实不一定非得用this,这个例子中,我们可以选个给匿名函数添加个名字

obj1={

fn:function fnname(n){

return n>2?fnname(n-1)+fnname(n-2):n;
}
}
我们发现和this的结果一样,但是这就避开了this的混淆视听,而且注意这个函数名只有函数内部可以访问,外部是访问不了的(请私下测试),这样就能避免诸如全局变量的问题。
还有一种解决方案,这个方案是最优雅的,所以我要作为大礼送给大家
我们知道有个arguments对象,这个对象里面有好多好玩的属性和方法,其中一个叫做callee,它的作用是调用函数本身!继续修改上面的例子

obj1={

fn:function(n){

return n>2?arguments.callee(n-1)+arguments.callee(n-2):n;
}
}
这个是目前我发现最优雅的方法,大家有其他更好的方案可以拿来讨论。
匿名函数的讨论先到此为止。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
有这样一类成功者:他们经商致富,于居室外置庭院,院中有亭翼然,亭上挂一面额。此时倘有人将“醉翁亭”题至编额中。主人公拍手称快道:“妙哉!”而若将“饮酒亭”题至匾额中,主人则不假思索道:“俗哉!”此类人追求文人本题。但实际上胸无点墨,只管把自己强行嵌入“雅”的框架中,就如同大观园中只顾赏花却不懂花的“伪君子”,总不免贻笑大方。 自古以来,世上总有各种困在框架里而不自知的人。他们如流水般虚浮,惯于遵从过去的经验或偏听一家之言,拘泥于既定枢架范式中。这些框架如同牢笼,让人的思维日渐固化,仿佛被“囚”于牢笼中,不见天日。归根结底,还是人本身缺乏硬实力所致。 在崇尚理学的明清时期,几乎所有人都成了封建社会值硬刻板的“木偶人”。可曹雪芹却通过笔下两个鲜明的角色,跳出了框架的束缚。此二人便是贾宝玉和林黛玉。他们不仅才华横溢,也在教育的熏陶中造就了自己独特的思维方式。这是一种因时因地制宜而去伪存真、去粗取精的思维方法,这样的方法可以教会一个人不要只顾跟随领跑者,而要学会超越领跑者,我愿称之为“宝黛思维”。 春秋时期的美女西施,天生丽质,举手投足间都流露着妩媚与柔情,而那些仰慕西施不顾现实加以效仿的人,不仅失去自己的特点,还闹出东施效颦的笑话。在全民创造短视频的热潮中,李子柒结合自己的兴趣与特长,对中国传统文化加以创新,以最具时代特征的形式,推动中国文化走向世界。由此可见,我们为人处世应当学习“宝黛思维”,以因地制宜为前提,实破框架束缚,勇于创新,方能成事。 虽说“他山之石,可以攻玉”。但真正的好玉,还得用心细“攻”,而非“一锤定音”,强行为之套上框架。只有培养并运用“宝黛思维”,才不会在山清水秀时自我陶醉而落入俗套,才不会在山穷水尽时野驴技穷而止步不前。只有跳出框架的人,才能知所进,知所惧,知所适。识时务。 “宝黛思维”可激发人的潜力,帮助我们脱去少年的程格。少年的我们唯有善用“宝黛思维”,方可跳出“囚人”的框架,释放知识和人生的光彩。 总结大意
02-17

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值