我的问题基于两个前提:(1)在调用包含它们的函数之前不执行代码,(2)变量保存在内存中。
那么,函数声明中初始化的变量是否总是在函数执行时重新初始化?
为了演示,如果我将函数声明中的变量初始化为一个巨大的对象并调用该函数,那么,巨大的对象将在内存中创建,保存或处理。如果我多次调用或执行该函数,那么每次执行函数时都会创建,保存或处理巨大的对象。然后,将对该变量进行如此多的大处理(包含该巨大的对象,如果只有一个)。因此,此行为将导致对性能的不良影响。我对此不太了解,这是对的吗?
这是用代码演示: 如果我声明全局变量,那么该过程只涉及价值变化。但是,如果我声明这样的局部变量:
var hugeObj = {
prop1 : function() {...},
prop2 : [...],
prop3 : {...},
};
我执行包含函数五次,然后在内存中将有五个“hugeObj”(具有不同的上下文)(并涉及更多处理)。
你能解释一下如何在函数声明中处理变量,它们是否会在每个执行上下文中创建?
答案 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;
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;
答案 3 :(得分:-2)
变量被命名为内存,它全部取决于变量的范围(Local或Global)函数内部的变量被称为局部变量,每次调用此函数时,变量都被重新初始化,这意味着每次调用时都会函数变量的值预计会改变。
public void myFunction(int val1, String val2)
{
int a = val1;
String b = val2;
System.out.println(val2 +" "+val1);
}
上面的a和b是局部变量,它将受到方法/函数调用传递给它的参数的影响 所以函数中变量的值总是会改变