我正在从John Resig的网站分析以下两个网址,但我不明白如何给匿名功能命名有所改变.
我的理解是,给匿名函数的名称只能在函数定义中使用,而不在其外部,但是在以下链接中,这是一个巨大的差异
> http://ejohn.org/apps/learn/#13
> http://ejohn.org/apps/learn/#14
任何解释或参考将是一个很大的帮助.
我仍然在#14中与以下几行混淆
var samurai = { yell: ninja.yell }; var ninja = {}; assert( samurai.yell(4) == "hiyaaaa","The method correctly calls itself." );
当忍者现在指向一个空白对象时,Samurai.yell方法仍然能够指向ninja.yell. #13和#14之间的区别只在#14中为函数表达式提供一个名称. ninja.yell COPIED可以大喊大叫,没有被引用,或者这些NAMED函数表达式在某些场景中具有这样的全局范围?
Same thing happens in #13 and #14,only difference is that function is named in #14 and unnamed in #13 plus ninja = {} in #14 and ninja = null in #13. Is there any hidden concept about NAMED FUNCTION EXPRESSIONS that I am missing which makes #14 workable and #13 not workable.
解决方法
不想与科琳克抗争,但他说这不是一个很好的例子,他有点太过分了. #14与你共享的链接有关(命名函数表达式(与函数声明不同的动物)).不管函数引用在哪里传递,如果你命名你的函数表达式,它将始终有一种方法来调用自身.这个名字,你给你的函数表达式,是一个只有它知道的名字;它不存在于任何外部范围内.
请参阅MDN上的here和here,以进一步讨论函数表达式与函数声明.底部的第二个链接有一个关于命名函数表达式的标题.它有一个用途;有关一次性递归函数的示例,请参见my Gist,对本地或全局变量范围(对于一次性DOM遍历有用)也不添加任何内容.
此外,Tobias(在他的回答中)指出了命名函数表达式的其他好处,即调试.