命名函数表达式-神秘性剖析
程序员文章站
2022-05-09 16:37:09
...
一个JS hacker -Juriy "kangax" Zaytsev 发表了一篇名为-"命名函数表达式的神秘性"的文章:
'简而言之,命名函数表达式最重要的是用于- 在调试和解析时描述函数名。也有可能会用于递归,但你很快就会知道,这往往是不切实际的东西。如果你对调试毫不关心,那就没什么好担心的,否则,还是仔细的阅读一下吧,你会看到一些跨浏览器的故障处理。'
举例来说,这是在不同的浏览器中出现的一个怪事,代码如下:
var f = function g() { return 1; }; if (false) { f = function g(){ return 2; } }; g(); // 2
还有:
var f = function g(){ return [ arguments.callee == f, arguments.callee == g ]; }; f(); // [true, false]
正确的使用:
// 1) enclose declaration with a separate scope var addEvent = (function(){ var docEl = document.documentElement; // 2) declare a variable to assign function to var fn; if (docEl.addEventListener) { // 3) make sure to give function a descriptive identifier fn = function addEvent(element, eventName, callback) { element.addEventListener(eventName, callback, false); } } else if (docEl.attachEvent) { fn = function addEvent(element, eventName, callback) { element.attachEvent('on' + eventName, callback); } } else { fn = function addEvent(element, eventName, callback) { element['on' + eventName] = callback; } } // 4) clean up `addEvent` function created by JScript // make sure to either prepend assignment with `var`, // or declare `addEvent` at the top of the function var addEvent = null; // 5) finally return function referenced by `fn` return fn; })();