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

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

通过查看调用栈的信息,我们可以很明了地知道foo调用了bar, bar又调用了baz(而foo本身有在expr_test.html文档的全局作用域内被调用),不过,还有一个比较爽地方,就是刚才说的Firebug为匿名表达式取名的功能:

  function foo(){    return bar();  }  var bar = function(){    return baz();  }  function baz(){    debugger;  }  foo();  // Call stack  baz  bar() //看到了么?   foo  expr_test.html()复制代码
然后,当函数表达式稍微复杂一些的时候,调试器就不那么聪明了,我们只能在调用栈中看到问号:

  function foo(){    return bar();  }  var bar = (function(){    if (window.addEventListener) {      return function(){        return baz();      };    }    else if (window.attachEvent) {      return function() {        return baz();      };    }  })();  function baz(){    debugger;  }  foo();  // Call stack  baz  (?)() // 这里可是问号哦  foo  expr_test.html()复制代码
另外,当把函数赋值给多个变量的时候,也会出现令人郁闷的问题:

  function foo(){    return baz();  }  var bar = function(){    debugger;  };  var baz = bar;  bar = function() {     alert('spoofed');  };  foo();  // Call stack:  bar()  foo  expr_test.html()复制代码
这时候,调用栈显示的是foo调用了bar,但实际上并非如此,之所以有这种问题,是因为baz和另外一个包含alert('spoofed')的函数做了引用交换所导致的。

归根结底,只有给函数表达式取个名字,才是最委托的办法,也就是使用命名函数表达式。我们来使用带名字的表达式来重写上面的例子(注意立即调用的表达式块里返回的2个函数的名字都是bar):

  function foo(){    return bar();  }  var bar = (function(){    if (window.addEventListener) {      return function bar(){        return baz();      };    }    else if (window.attachEvent) {      return function bar() {        return baz();      };    }  })();  function baz(){    debugger;  }  foo();  // 又再次看到了清晰的调用栈信息了耶!  baz  bar  foo  expr_test.html()复制代码
OK,又学了一招吧?不过在高兴之前,我们再看看不同寻常的JScript吧。

JScript的Bug
比较恶的是,IE的ECMAScript实现JScript严重混淆了命名函数表达式,搞得现很多人都出来反对命名函数表达式,而且即便是最新的一版(IE8中使用的5.8版)仍然存在下列问题。

下面我们就来看看IE在实现中究竟犯了那些错误,俗话说知已知彼,才能百战不殆。我们来看看如下几个例子:

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

推荐热点

  • 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