Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

低版本IE的命名函数表达式句柄问题

  在之前的文章中已经介绍过了命名函数表达式语法在低版本IE上的问题,低版本IE会把命名函数表达式的函数名作为变量定义到代码所在的作用域下。除此之外还有另一个问题,由于表达式定义与函数本身的定义是两个不同的定义,这就产生了两个不同的句柄。
<script>
var a,b;
(a=function b(){
  alert(a.toString()==b.toString()); //true
  alert(a==b); //IE<9?false:true
})();
</script>
  在全局作用于下,变量a是函数表达式的结果,变量b是由function语句定义出来的东西(在支持命名函数表达式的浏览器上b是函数内的局部变量)。它们的函数体、参数列表、作用域,全都相同,但却是不同的对象。或者说这个函数字面量被使用了两次,就像 <script>
var i,s,a,b;
for(i in s=["a","b"])window[s[i]]=function(){
  alert(a.toString()==b.toString()); //true
  alert(a==b); //false
};
a();
</script>
  这会带来什么问题呢?比如事件绑定的问题 <script>
document.addEventListener
  ?document.addEventListener("click",function callee(){
    alert(callee);
    document.removeEventListener("click",callee); //正常注销事件
  })
  :document.attachEvent("onclick",function callee(){
    alert(callee);
    document.detachEvent("onclick",callee); //句柄不同无法注销事件
  });
</script>
  所以在使用命名函数表达式且兼容低版本IE时就要谨慎,不要因为IE也能定义出函数名而忽略了句柄不同的问题。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^