понимание локальных и глобальных переменных в javascript - PullRequest
0 голосов
/ 15 марта 2020

Я пишу этот код для массива случайных чисел:

function shuffle(arr) {
    for (i = 0; i < arr.length; i++) {
        x = Math.floor(Math.random() * arr.length);
        y = Math.floor(Math.random() * arr.length);
        if (x === y) { //for dont change arr[i] with arr[i]!!!
            continue;
        }
        temp0 = arr[x];
        arr[x] = arr[y];
        arr[y] = temp0;
    }
    return arr
}

, он работает правильно. но моя проблема в том, что эта функция не глобальная, я объясняю это на примере:

    sampleArray=["a", "b", "c", "d"];

    shuffle(sampleArray); //only run function
    console.log (sampleArray); // output NOT shuffled. ==>> ["a", "b", "c", "d"]
    console.log (shuffle(sampleArray)); //output shuffled. my be ["d", "a", "c", "b"] or ...

в основном коде, я не могу объявить sampleArray, вложенный в функцию shuffle ...

Ответы [ 2 ]

1 голос
/ 15 марта 2020

let, const и var context

Если вы не определите свои переменные с помощью let, const или var, они будут определены как глобальные переменные.

У вас есть здесь хороший учебник о javascript переменных и области видимости.

Но возобновление:

  • Если вы не поставите let, const или var перед тем, как определение вашей переменной будет всегда создаваться как глобальная переменная.
  • Если вы используете var ранее, переменная будет создана как область действия функции.
  • Если вы используете let ранее, переменная будет иметь область видимости блока (между двумя {}).
  • Если вы используете const ранее, применяются те же правила let, за исключением Вы не можете переназначить новое значение переменной.

Более того!

Недопустимые значения, такие как массивы, в javascript передаются функции в качестве ссылки, это означает, что если вы измените какое-либо значение массива внутри функции, то изменится и исходная переменная: (Для получения дополнительной информации * 103 7 * проверьте эту ссылку) . Вот почему ваш sampleArray изменяется: потому что вы изменяете переменную arr, которая ссылается на sampleArray в функции shuffle.

Пример времени!

Для этого в работу, которую вы могли бы выполнить глубокой копией arr внутри функции shuffle следующим образом:

function shuffle(arr) {
    //deep copy
    const deepCopyArray = JSON.parse(JSON.stringify(arr));
    for (i = 0; i < deepCopyArray.length; i++) {
        x = Math.floor(Math.random() * deepCopyArray.length);
        y = Math.floor(Math.random() * deepCopyArray.length);
        if (x === y) { //for dont change arr[i] with arr[i]!!!
            continue;
        }
        temp0 = deepCopyArray[x];
        deepCopyArray[x] = deepCopyArray[y];
        deepCopyArray[y] = temp0;
    }
    return deepCopyArray
}

sampleArray=["a", "b", "c", "d"];
shuffle(sampleArray); //only run function
console.log (sampleArray); // output NOT shuffled. ==>> ["a", "b", "c", "d"]
console.log (shuffle(sampleArray)); //output shuffled. my be ["d", "a", "c", "b"]
0 голосов
/ 15 марта 2020

в вашем коде есть опечатка. длина НЕ длина Кроме того, поскольку массивы передаются по ссылке, вам не нужно возвращать

function shuffle(arr) {

    for (i = 0; i < arr.length; i++) {
        var  x = Math.floor(Math.random() * arr.length);
        var  y = Math.floor(Math.random() * arr.length);
        
        if (x === y) { //for dont change arr[i] with arr[i]!!!
            continue;
        }
        temp0 = arr[x];
        arr[x] = arr[y];
        arr[y] = temp0;
    }
    
    
}
sampleArray=["a", "b", "c", "d"];



shuffle(sampleArray);


console.log(sampleArray);
...