了解javascript中的局部和全局变量
我为shuffle数组编写以下代码:了解javascript中的局部和全局变量,javascript,function,scope,Javascript,Function,Scope,我为shuffle数组编写以下代码: 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]!!
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
}
在主代码中,我不能声明嵌套在shuffle函数中的sampleArray…let
、const
和var
上下文
如果不使用let
、const
或var
定义变量,则这些变量将被定义为全局变量
关于javascript变量和作用域,您有一个很好的教程
但恢复:
- 如果不将
,let
或const
放在变量定义之前,则始终将其创建为全局变量var
- 如果之前使用了
,变量将被创建为函数作用域var
- 如果在前面使用
,则变量的作用域为块(在两个{}之间)let
- 如果以前使用过
,则会应用与const
相同的规则,但不能为变量重新指定新值let
sampleArray
的原因:因为您更改了arr
变量,该变量在shuffle
函数中引用sampleArray
示范时间!
为此,您可以在shuffle
函数中执行如下操作:
函数洗牌(arr){
//深度复制
const deepCopyArray=JSON.parse(JSON.stringify(arr));
对于(i=0;i>[“a”、“b”、“c”、“d”]
console.log(shuffle(sampleArray))//输出混乱。我的be[“d”、“a”、“c”、“b”]
您的代码中有一个输入错误。长度不是长度。另外,由于数组是通过引用传递的,所以不需要返回
函数洗牌(arr){
对于(i=0;i log(sampleArray)
AFAIK您使用的所有变量都是全局变量。@evolutionxbox唯一非全局变量是arr
,因为它是一个参数。其他一切都是全球性的。@VLAZ你说得对!这是一个参数。(我没有发现)@sMohammad14但是你展示的代码没有使用let、const或var。是的,对我有用。但有一个问题,这是标准代码吗!?没有返回的函数!?。我之所以问这个问题,是因为当console中的console.log(shuffle(sampleArray))显示undefinedfunctions时,不需要返回语句。如果需要,您可以添加一个返回语句,但在这里您并不真正需要它。请向我介绍一个关于js@DCR中调用类型的参考(简单英语)
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 ...