Web 技术研究所

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

关于命名函数表达式

  关于callee的效率问题,必须使用命名函数来解决,而直接使用命名函数不环保,因此MDN上建议使用命名函数表达式来解决。但是IE8-并没有兼容好命名函数表达式,依然使用者传统IE的诡异行为,所以命名函数表达式只能用在一些现代化的项目中。
  咱先来看一段代码 ~function f(){alert("表达式1")};

function f(){alert("语句")};

~function f(){alert("表达式2")};

f();
  这个代码会输出什么呢?结果是现代浏览器中输出“语句”,IE8-中输出“表达式2”。这就是因为IE8-中对命名函数表达式的兼容有问题!函数有语句和表达式两种定义形式,作为语句时是与var一样预处理的,作为表达式时就是正常的执行到时处理。上面这段代码中给function前面加上“~”运算符它就变成了表达式。但是呢,这个表达式却有函数名,这就是命名函数表达式的概念。IE8-中会把这个函数名释放到当前作用域中,所以最后执行到的函数定义是“表达式2”的函数定义,它覆盖掉之前定义的f,所以IE8-才有输出“表达式2”的结果。而现代浏览器对它的解析就是一个正宗的命名函数表达式,这个函数名不会被释放到当前作用域中,而是仅在自身函数内有效。比如:
var f;
(function f(){
  alert(f==arguments.callee); //true
})();
alert(f); //undefined
  它可以达到和callee完全相同的效果,而且不会影响所在的作用域,并且不用经过arguments而带来不必要的性能开销,所以MDN才建议使用命名函数表达式来替代callee。但是这仅限于现代浏览器,对于需要兼容IE8-的项目我依然建议使用callee。当然,对于一些非常有必要做细节性能优化的代码也可以使用命名函数的方式来避开arguments。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^