本文介绍了循环中javascript中函数声明与函数表达式的表现的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在以下jsperf中:

In the following jsperf: http://jsperf.com/defined-function-vs-in-loop-function/3

你会注意到这段代码:

for (var i = 0; i < loops; i++) {
   function func(a, b) {
    return a + b;
  };
  func(i, i);
}

与此代码相同:

function declaredFn(a, b) {
    return a + b;
};


for (i = 0; i < loops; i++) {
    declaredFni, i);
}

但是此代码:

for (i = 0; i < loops; i++) {
  var func = function(a, b) {
    return a + b;
  };
  func(i, i);
}

明显慢于此代码:

var expfunc = function(a, b) {
  return a + b;
};
for (i = 0; i < loops; i++) {
  expfunc(i, i);
}

为什么?内部发生了什么?

Why? What is happening internally?

推荐答案

如果使用函数定义函数fn(){} 声明,它被提升到顶部。因此,这段代码:

If you define a function using the function fn() {} declaration, it gets hoisted to the top. Therefore, this code:

for (var i = 0; i < loops; i++) {
   function func(a, b) {
    return a + b;
  };
  func(i, i);
}

与此代码完全等效

function declaredFn(a, b) { return a + b; };

for (i = 0; i < loops; i++) { declaredFn(i, i); }

因为函数声明被提升到顶部。

because the function declaration gets hoisted to the top.

然而, var fn = function(){} 表达式升级,所以你最终在每个循环中都定义了函数。

However, var fn = function() {} expressions do not get hoisted, so you end up defining the function all over on every single loop.

参见了解更多信息。

这篇关于循环中javascript中函数声明与函数表达式的表现的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-22 12:29