了解javascript中的局部和全局变量

了解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]!!

我为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]!!!
            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
    相同的规则,但不能为变量重新指定新值
此外 javascript中的数组等非许可值作为引用传递给函数,这意味着如果更改函数中的任何数组值,原始变量也将更改为is value(有关更多信息,请参阅此链接)。这就是更改
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;ilog(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 ...