在没有或没有函数的情况下更新Javascript中的全局变量之间的区别

时间:2017-07-22 12:02:31

标签: javascript return

这两种方法在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

2 个答案:

答案 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.