当函数执行(Javascript)时,函数声明中的变量是否始终重新初始化?

时间:2016-02-08 13:44:33

标签: javascript performance function variables scope

我的问题基于两个前提:(1)在调用包含它们的函数之前不执行代码,(2)变量保存在内存中。

那么,函数声明中初始化的变量是否总是在函数执行时重新初始化?

为了演示,如果我将函数声明中的变量初始化为一个巨大的对象并调用该函数,那么,巨大的对象将在内存中创建,保存或处理。如果我多次调用或执行该函数,那么每次执行函数时都会创建,保存或处理巨大的对象。然后,将对该变量进行如此多的大处理(包含该巨大的对象,如果只有一个)。因此,此行为将导致对性能的不良影响。我对此不太了解,这是对的吗?

这是用代码演示: 如果我声明全局变量,那么该过程只涉及价值变化。但是,如果我声明这样的局部变量:

var hugeObj = {
   prop1 : function() {...},
   prop2 : [...],
   prop3 : {...},
};

我执行包含函数五次,然后在内存中将有五个“hugeObj”(具有不同的上下文)(并涉及更多处理)。

你能解释一下如何在函数声明中处理变量,它们是否会在每个执行上下文中创建?

4 个答案:

答案 0 :(得分:0)

答案是肯定的,每次运行该函数时,它的内部变量都会被重新初始化并且不会被重用。

function MyFunc(newValue){
  var v;
  if(newValue) v = newValue;
  return v;
};


console.log(MyFunc()); // undefined
console.log(MyFunc(5)); // 5
console.log(MyFunc()); // undefined

// Therefore we can conclude that the object is re-initialized each time the function is run and its previous variable values are not reused.

如果您希望每次初始化变量,只需全局初始化变量。

var v;
function MyFunc(newValue){
  if(newValue) v = newValue;
  return v;
};


console.log(MyFunc()); // undefined
console.log(MyFunc(5)); // 5
console.log(MyFunc()); // 5

答案 1 :(得分:0)

除了@DustinPoissant的答案之外,您还可以在函数内声明不同的范围(本地或全局)。

让我们使用与答案相同的代码:



function MyFunc(newValue){
  var v;
  if(newValue) v = newValue;
  return v;
};


console.log(MyFunc()); // undefined
console.log(MyFunc(5)); // 5
console.log(MyFunc()); // undefined




在这种情况下,范围是本地函数,但是如果您使用remvoe var关键字,则范围将更改为全局(是的,v变量将附加到window对象):



function MyFunc(newValue){
  if(newValue) v = newValue;
  return v;
};


console.log(MyFunc()); // undefined
console.log(MyFunc(5)); // 5
console.log(MyFunc()); // 5




这和写一样:



function MyFunc(newValue){
  if(newValue) window.v = newValue;
  return window.v;
};


console.log(MyFunc()); // undefined
console.log(MyFunc(5)); // 5
console.log(MyFunc()); // 5




答案 2 :(得分:0)

因为其中一个变量存储在外部,同时运行两个变量,一个将保持其值,在函数内初始化的变量将被覆盖。



var array = ["1","2","3","4","5"];

function MyFunc()
{
  var current = "0";
  console.log("Iteration");
  for(var i = 0; i < array.length; i++)
  {
    current += array[i];
    console.log(current);
  }
};

console.log(MyFunc());
console.log(MyFunc());
&#13;
&#13;
&#13;

&#13;
&#13;
var array = ["1","2","3","4","5"];
var current = "0";

function MyFunc()
{
  console.log("Iteration");
  for(var i = 0; i < array.length; i++)
  {
    current += array[i];
    console.log(current);
  }
};

console.log(MyFunc());
console.log(MyFunc());
&#13;
&#13;
&#13;

答案 3 :(得分:-2)

变量被命名为内存,它全部取决于变量的范围(Local或Global)函数内部的变量被称为局部变量,每次调用此函数时,变量都被重新初始化,这意味着每次调用时都会函数变量的值预计会改变。

public void myFunction(int val1, String val2)
{
 int a = val1;
 String b = val2;
 System.out.println(val2 +" "+val1);
}

上面的a和b是局部变量,它将受到方法/函数调用传递给它的参数的影响 所以函数中变量的值总是会改变