将窗口变量分配给局部变量

时间:2018-10-15 14:55:12

标签: javascript

我一直在从事Web项目,但是在将窗口变量分配给Javascript中的另一个变量时遇到问题。

例如,我有一个生成随机代码的函数:

window.onload=function(){
    ...
    window.c=genCode(); //Gets an array with 4 strings like ['g', 'r', 'p', 'b'] (first letter of colors of the rainbow)
    ...
}

然后在程序的后面,我有一个测试,该测试将使用变量中的数据,并最小化新变量

var guess=function(){
    ...
    let tempC=window.c;
    ...
    for(let i=0;i<4;i++){
        ...
        tempC[i]='n';
        ...
    }
}

本地变量tempC被更改,window.c也被更改。

我的解决方法是只具有一个返回变量的函数。

var retCode=function(){
    return window.c;
}

这可行,但是为什么会这样呢?当您将数据分配给变量时,我认为它应该只修改指定的变量,而不是从中获取数据的变量。这只是一个JavaScript怪癖吗?它与window的工作方式有关系吗?

2 个答案:

答案 0 :(得分:0)

数组和对象通过引用在JavaScript中传递。这意味着变量包含对特定数组的引用,而不是数组本身。因此,当您对该数组进行修改时,它们会在其他地方持久存在。

robocopy C:\source1 C:\destination /E /XO
robocopy C:\source2 C:\destination /E /XO
[etc]

如果要获取不会被原始值破坏的数组副本,则需要使用返回新数组的操作。像var arr = [1,2,3,4,5]; function changesArr(t){ t.push(6); t.push(7); } changesArr(arr); console.log('1 to 7'); console.log(arr); var newArr = arr; newArr.push(8); console.log('1 to 8'); console.log(arr);

slice()

答案 1 :(得分:0)

JavaScript中的数组是通过引用传递的,您可以在此处阅读有关此内容的更多信息:Is JavaScript a pass-by-reference or pass-by-value language?

也就是说,要解决您的特定情况,只需复制数组即可。由于阵列很小,因此您甚至不必担心性能,只需这样做:

let tempC = JSON.parse(JSON.stringify(window.c));

这会将原始数组转换为兼容JSON的字符串,然后再次解析,丢失对原始数组的任何引用

如果您不喜欢这种方法,仍然可以在这里找到更多信息:Copying of an array of objects to another Array without object reference in javascript(Deep copy)