js 作用域问题

js 作用域问题?

//下面这种情况 可以执行

function shuffle(arr) {  
    for(let i = arr.length; i ; i--){  
        let j = Math.floor(i * Math.random());  
        [arr[i-1], arr[j]] = [arr[j], arr[i-1]]  
    }  
    return arr  
}

// 下面这个会报Cannot access 'j' before initialization

function shuffle(arr) {  
    for(let i = arr.length; i ; i--){  
        let j = Math.floor(Math.random() * i)  
        [arr[i-1], arr[j]] = [arr[j], arr[i-1]]
    }  
    return arr  
}
阅读 2.8k
3 个回答

看了下代码,区别在于 Math.floor(i * Math.random()) 后面有没有分号 ;
没有分号的时候代码实际上是:

function shuffle(arr) {  
    for(let i = arr.length; i ; i--){  
        let j = Math.floor(Math.random() * i)[arr[i-1], arr[j]] = [arr[j], arr[i-1]];
    }
    return arr
}

很明显,被拼接之后,等号右边的 j 还没有初始化。
所以,不管那些放荡不羁爱自由的人怎么污蔑,JS 的时候,语句末尾加分号都是必须的
补充一点知识,这种情况下,var 的值为 undefined,而 letconst 则无法访问,直接报错,因为 var 存在变量提升

就是语法问题,圆括弧,中括弧开头,解释器会认为是函数调用或者取属性,除非上一条语句已经结束。分号可以告知解释器语句结束。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题