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"]