哪些跨浏览器的Javascript函数表现更好?

cbp*_*cbp 3 javascript performance cross-browser

根据经验,这些编写跨浏览器Javascript函数的方法中哪一个会表现更好?

方法1

function MyFunction() 
{
    if (document.browserSpecificProperty)
       doSomethingWith(document.browserSpecificProperty);
    else
       doSomethingWith(document.someOtherProperty);
}
Run Code Online (Sandbox Code Playgroud)

方法2

var MyFunction;
if(document.browserSpecificProperty) {
    MyFunction = function() {
       doSomethingWith(document.browserSpecificProperty);
    };
} else {
    MyFunction = function() {
       doSomethingWith(document.someOtherProperty);
    };
}
Run Code Online (Sandbox Code Playgroud)

编辑:迄今为止所有优秀答案的Upvote.我已经将函数修复为更正确的语法.

到目前为止,关于答案的几点 - 虽然在大多数情况下它是一个相当无意义的性能增强,但是有一些原因可能仍然需要花费一些时间来分析代码:

  • 必须在慢速计算机,移动设备,旧浏览器等上运行.
  • 好奇心
  • 使用相同的通用主体来提高性能,增强对IF语句的评估确实 需要一些时间的其他方案.

Rex*_*x M 16

除非你这样做万亿次,否则没关系.使用对您和/或您的组织更具可读性和可维护性的那个.通过编写干净,简单的代码,您可以获得的生产率提高,而不仅仅是缩短JS执行时间的十分之一秒.

你甚至应该开始考虑什么时候表现更好,只有当你编写代码并且速度慢得令人无法接受时.然后你应该开始追踪瓶颈,这永远不会是这样的.在这里,从一个切换到另一个,你永远不会获得可衡量的性能提升.


oll*_*iej 7

不幸的是,上面的代码实际上并不是跨浏览器友好的,因为它依赖于其他浏览器中不存在的mozilla怪癖 - 即function 语句被视为分支内的function 表达式.在其他不基于mozilla构建的浏览器上,上面的代码将始终使用第二个函数定义.我做了一个简单的测试用例来证明这一点.

基本上ECMAScript规范说函数语句的处理方式类似于var声明,例如.它们都被提升到当前执行范围的顶部(例如,<script>标记的开始,函数的开始或eval块的开始).