繁体   English   中英

javascript-在函数内设置全局变量

[英]javascript - setting global variables inside a function

我正在尝试创建一个函数,该函数将动态设置将任何全局变量作为参数传递的值。 它不起作用,我正在尝试找出原因。 有人可以解释为什么这行不通吗:

var things = 5;

function setup(variable) {
    variable = 7;
}

setup(things);

console.log(things); //should return 7. returns 5 instead. the function had no effect on the global variable

而且这也不起作用:

var things = 5;

function setup(variable) {
    window.variable = 7;
}

setup(things);

console.log(things); //should return 7, but returns 5. still not accessing the global variable.

但是这样做:

var things = 5;

function setup(variable) {
    window[variable] = 7;
}

setup("things");

console.log(things); //returns 7

我怀疑正在发生的事情是参数variable被设置为函数内部的局部变量,因此任何更改都只发生在局部版本上。 但这似乎很奇怪,因为已传递的参数是全局变量。 有人可以向我解释正在发生什么以及如何更好地编写此代码吗? 这是否需要一种方法(然后可以使用this方法访问原始对象)?

谢谢!!

Javascript是按值传递的。 (对象,数组和其他非原语通过引用值传递。)这意味着变量(或引用)的值传递给函数,但函数参数不会成为实际值的别名。论点。 因此,您不能在不引用函数的情况下更改变量(如您在上一个示例中所做的那样)。

有关更多信息,请参见另一个线程中的此答案

函数内部是“可变环境”。 声明功能安装程序并设置参数变量后,它将在安装程序的变量环境中为variable (参数)创建局部变量。

所以这就是为什么这个任务

function setup(variable) {
 variable = 7;
}

永远不会改变发送给变量的值。

JavaScript中的变量是值。 传递变量时,唯一传递的是变量的值。 但是,变量的值已分配给参数(在此示例中再次命名不佳) variable 将参数的值分配为7时,仅更改局部变量,而不更改传递的变量的值。

//the value of things is 5
var things = 5;

//the passed value 5 is assigned to variable
function setup(variable) {
  //the value of variable is changed to 7 (and nothing is done with 5)
  variable = 7;
}

//the value of things is sent to setup
setup(things);

希望这会有所启发。 考虑一种情况,其中setup实际上在修改变量的值。 一个很好的例子是当值具有状态时,例如数组或对象。

//the value of things this time is an object
var things = {};

//the passed value of object is assigned to variable
function setup(variable){
 //the value of variable (the object) has a property added named msg with a value of "hello world"
 variable.msg = "hello world";
}

//the value of things (an object) is sent to setup
setup(things);
alert(things.msg);//hello world

将变量作为参数传递给函数时,将复制它们的值并将其分配给函数中参数的名称。

例如:

function foo(a) {
    a = 7; // sets the temporary variable(argument) a to 7
}

var bar = 24; 
foo(bar); // copies bar's value and passes in the copy to foo

对于要修改变量本身的函数,您将不得不以另一种方式访问​​它。 在其他语言中,有一些东西称为指针,它们指向内存中的位置。 这样一来,您就可以直接修改变量,只要它们位于其中即可-您可以使用JavaScript进行模拟:

var spam = 3;
var memory = ["bar", 29, "x", foo, false];

function foo(a) {
    memory[a] = 7;
}

foo(3);

上面的示例设置了一个称为内存的数组,并用乱码填充它。 然后,创建一个名为foo的函数,该函数允许修改此内存数组中的元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM