JS可变范围查找与分配

时间:2018-03-24 15:46:38

标签: javascript

如果我将函数应用于javascript数组,即

var a = [1,2,3,4];
var x;

a.forEach(function(val) {
    x = val + 1;
    // do some stuff with x        
});

将变量声明留在外部作用域中或将声明放在函数中是否更好?即。

var a = [1,2,3,4];

a.forEach(function(val) {
    var x = val + 1;
    // do some stuff with x
});

我不知道的是x的内存分配是否比变量查找过程更昂贵。

5 个答案:

答案 0 :(得分:0)

如果您不需要forEach回调之外的变量,请将其置于其中。这样简单干净。记忆不是问题。

答案 1 :(得分:0)

最好将它放入循环中。没有性能差异。但是,正确使用范围是检测错误的良好起点:

  var something = 5;

  a.forEach(el => something = el);

  console.log(something); // what is something? Why is it set?

答案 2 :(得分:0)

完全取决于你想用x变量做什么,如果你想在回调之外访问它的值然后全局声明它作为第一个场景,如果你不想访问那么声明里面是一个更好的方法。记忆消耗非常少,所以不用担心。

答案 3 :(得分:0)

  

我不知道的是x的内存分配是否比变量查找过程更昂贵

取决于。它取决于确切的代码,数组的大小,代码运行的频率,访问变量的代码和声明变量的范围之间有多少范围,代码所在的JavaScript引擎的优化是什么跑步等等。

所以:尽可能写出最清晰,最简单的代码, 如果 您遇到与该代码相关的性能问题,配置文件更改看看如何解决它。其他任何事情都是过早优化而浪费你的时间。

然而:根据给出的示例,如果您在回调中声明它,x将是本地堆栈变量,并且非常便宜到分配(在执行时间方面)。我无法看到这两种方式真的很重要(如果你在外面声明它,它只是一个范围之外),但在这种情况下,最简单,最干净的代码(在回调中声明它)至少可能发生不要比其他选择更糟糕,而且我几乎肯定会说更好。但同样:如果这是一个问题,请分析实际代码。

答案 4 :(得分:0)

实际上,这种变化控制着两个参数:范围和启动 范围:如果你需要在循环之外使用这个var,那么你需要将它声明到一边,否则你可以将它放入并且每次迭代并且范围将声明,它可能会将范围内的内存保存。 启动:在大型项目中,启动可能是批评时间, 每次循环发生时你需要声明var及其浪费时间......