阅读更多

7顶
2踩

Web前端

原创新闻 命名函数表达式-神秘性剖析

2009-06-19 12:06 by 副主编 zly06 评论(3) 有4977人浏览
F#

一个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;
  })();


点击查看详情:demystifying named function expressions

来自: ajaxian
7
2
评论 共 3 条 请登录后发表评论
3 楼 hax 2009-06-20 11:12
对此现象,本文有详细的解释:

http://hax.javaeye.com/blog/230182
2 楼 incredible 2009-06-19 15:06
记住好的用法就可以了,忘掉坏的用法也就避免了很多问题
1 楼 night_stalker 2009-06-19 13:11
那两个例子不是怪事 …… 而是写法太怪异了 ……
最好的解决方式是避免 f = function g(),全部统一成为 f = function()

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

Global site tag (gtag.js) - Google Analytics