这两种方法在Javascript中更新(全局)变量的值有什么区别?
var a = true;
a = false; // UPDATING WITH FUNCTION/RETURNING
console.log(a); // false
var changeAndReturna = function(p) {
p = false;
console.log(p);
return p;
};
changeAndReturna(a); // UPDATING WITH FUNCTION/RETURNING // false
答案 0 :(得分:3)
主要区别在于您的第二个示例根本没有更新a
:
var a = true;
var changeAndReturna = function(p) {
p = false;
console.log(p);
return p;
};
changeAndReturna(a);
console.log(a); // still true

要更新a
,必须执行以下操作:
a = changeAndReturna(a);
// ^^^^
(或者,因为a
是全局的,所以在函数中分配给a
。这通常是不好的做法。)
原因是变量a
没有传递给函数;确定a
的值,然后将值传递给函数并作为p
接收。您已更新p
(对a
无效)。
JavaScript是纯粹的按值传递语言。这意味着当您将变量作为参数提供给函数时:
var a = 42;
foo(a);
...该变量(42)的值被传递给函数,而不是对它来自的变量的引用。这在JavaScript中始终为真。
有些语言(可选)可以将引用传递给变量(传递引用),例如C ++或C#;在这些语言中,您可以使用该变量引用来更改传入的变量的值。但JavaScript纯粹是按值传递。
(是的,即使是对象。值是对象引用,而不是对象。对象引用不是变量引用.JavaScript有对象引用。它没有变量引用。传递引用需要变量引用。)
答案 1 :(得分:0)
在这里,我们通过pass by value
方法调用函数,因此它不会更改a
的值。
请参阅代码中的注释。
var a = 1;
a = 2;
console.log("a without func = "+ a);
var changeAndReturna = function(p) {
p = 3;
//a=3; //if you update the value here, first it search var 'a' inside the func, if it won't get any variable then search 'a' globally and assign the value 3 to 'a'.
console.log("inside func = " + p);
return p;
};
//a= changeAndReturna(a); //here you can assign 'a' with return val of func
console.log("ruturn val of func = "+ changeAndReturna(a)); //here we are passing value as "pass by value" approach.
console.log("after func call, a = "+ a); // if you change the value of 'a' inside function or with return value then it will show the updated value.