深入理解JavaScript系列(2):揭秘命名函数表达式(3)

来源:未知 责任编辑:责任编辑 发表时间:2014-01-26 22:00 点击:

5.另外一个,早期基于Gecko的实现(Firefox 3及以前版本)中存在一个bug,即函数语句覆盖函数声明的方式不正确。在这些早期的实现中,函数语句不知何故不能覆盖函数声明:

  // 函数声明  function foo(){ return 1; }  if (true) {    // 用函数语句重写    function foo(){ return 2; }  }  foo(); // FF3以下返回1,FF3.5以上返回2    // 不过,如果前面是函数表达式,则没用问题  var foo = function(){ return 1; };  if (true) {    function foo(){ return 2; }  }  foo(); // 所有版本都返回2复制代码
再次强调一点,上面这些例子只是在某些浏览器支持,所以推荐大家不要使用这些,除非你就在特性的浏览器上做开发。

命名函数表达式
函数表达式在实际应用中还是很常见的,在web开发中友个常用的模式是基于对某种特性的测试来伪装函数定义,从而达到性能优化的目的,但由于这种方式都是在同一作用域内,所以基本上一定要用函数表达式:

  // 该代码来自Garrett Smith的APE Javascript library库(http://dhtmlkitchen.com/ape/)   var contains = (function() {    var docEl = document.documentElement;    if (typeof docEl.compareDocumentPosition != 'undefined') {      return function(el, b) {        return (el.compareDocumentPosition(b) & 16) !== 0;      };    }    else if (typeof docEl.contains != 'undefined') {      return function(el, b) {        return el !== b && el.contains(b);      };    }    return function(el, b) {      if (el === b) return false;      while (el != b && (b = b.parentNode) != null);      return el === b;    };  })();复制代码

提到命名函数表达式,理所当然,就是它得有名字,前面的例子var bar = function foo(){};就是一个有效的命名函数表达式,但有一点需要记住:这个名字只在新定义的函数作用域内有效,因为规范规定了标示符不能在外围的作用域内有效:

  var f = function foo(){    return typeof foo; // foo是在内部作用域内有效  };  // foo在外部用于是不可见的  typeof foo; // "undefined"  f(); // "function"复制代码
既然,这么要求,那命名函数表达式到底有啥用啊?为啥要取名?

正如我们开头所说:给它一个名字就是可以让调试过程更方便,因为在调试的时候,如果在调用栈中的每个项都有自己的名字来描述,那么调试过程就太爽了,感受不一样嘛。

调试器中的函数名
如果一个函数有名字,那调试器在调试的时候会将它的名字显示在调用的栈上。有些调试器(Firebug)有时候还会为你们函数取名并显示,让他们和那些应用该函数的便利具有相同的角色,可是通常情况下,这些调试器只安装简单的规则来取名,所以说没有太大价格,我们来看一个例子:

  function foo(){    return bar();  }  function bar(){    return baz();  }  function baz(){    debugger;  }  foo();  // 这里我们使用了3个带名字的函数声明  // 所以当调试器走到debugger语句的时候,Firebug的调用栈上看起来非常清晰明了   // 因为很明白地显示了名称  baz  bar  foo  expr_test.html()复制代码

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • Gb2312转utf-8编码的方法(vbs+js)
  • 如何使用Ajax技术开发Web应用程序(1)
  • js跳转路径问题
  • JavaScript模仿桌面窗口
  • 用js检测两个线段是否相交
  • 我知道的JavaScript -- 设计模式(桥接)应用之 – 验证器
  • 运用JavaScript构建你的第一个Metro式应用程序(on Windows
  • 我是如何去了解jquery的(六),案例之幻灯片轮换
  • Jquery封装幻灯片效果
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1