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
}
看了下代码,区别在于
Math.floor(i * Math.random())
后面有没有分号;
。没有分号的时候代码实际上是:
很明显,被拼接之后,等号右边的
j
还没有初始化。所以,不管那些放荡不羁爱自由的人怎么污蔑,写
JS
的时候,语句末尾加分号都是必须的。补充一点知识,这种情况下,
var
的值为undefined
,而let
和const
则无法访问,直接报错,因为var
存在变量提升。