我正在分析 John Resig 网站上的以下两个 url,但我不明白为匿名函数命名有何不同。
我的理解是,赋予匿名函数的名称只能在函数定义内部使用,而不能在函数定义之外使用,但在以下链接中它会产生巨大的差异
- http://ejohn.org/apps/learn/#13 http://ejohn.org/apps/learn/#13
- http://ejohn.org/apps/learn/#14 http://ejohn.org/apps/learn/#14
任何解释或参考都会有很大的帮助。
我仍然对 #14 中的以下几行感到困惑
var samurai = { yell: ninja.yell };
var ninja = {};
assert( samurai.yell(4) == "hiyaaaa", "The method correctly calls itself." );
当 ninja 现在指向一个空白对象时,Samurai.yell 方法如何仍然能够指向 ninja.yell。
#13 和 #14 之间的唯一区别是为 #14 中的函数表达式提供名称。
ninja.yell 是否被复制到 yell 且未被引用,或者这些 NAMED 函数表达式在某些情况下具有全局作用域,如下所示?
同样的事情发生在 #13 和 #14 中,唯一的区别是函数在 #14 中被命名,而在 #13 中未命名,加上 #14 中的 ninja = {} 和 #13 中的 ninja = null。我是否遗漏了有关命名函数表达式的任何隐藏概念,这使得#14 可行而#13 不可行。
在内部示例中,您可以跳过 #13 中对 ninja 对象的额外访问
匿名闭包(访问对象ninja
尽管我们已经处于这种情况,但仍然需要):
var ninja = {
yell: function(n){
return n > 0 ? ninja.yell(n-1) + "a" : "hiy";
}
};
命名闭包可以直接调用:
var ninja = {
yell: function yell(n){
return n > 0 ? yell(n-1) + "a" : "hiy";
}
};
另一个优点是命名闭包支持堆栈跟踪:
所以假设你这样做:
(function fooBar() { console.log(brazl); })();
// will create an error with "fooBar" in the stack trace instead of "anonymous function"
编辑:虽然它可能看起来像是开销,但有时它有助于在开发过程中进行调试,例如 YUICompressor 和 Closure Compiler 可以删除这些名称(如果本质上不需要)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)