欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  资讯频道

命名函数表达式-神秘性剖析

程序员文章站 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;
  })();


点击查看详情:demystifying named function expressions

相关标签: F#