function fn(){let a = "fn中的变量a"console.log(a)
}fn()
console.log(a) // undefined
当我们使用一个变量时,JS解释器会优先在当前作用域中寻找变量,就近原则
参照下面的例子理解
报错的原因看下一节提升相关概念
let a = 10{console.log(a) // 报错,Cannot access 'a' before initializationlet a = "第一代码块中的a"console.log(a) // "第一代码块中的a"{console.log(a) // 报错,Cannot access 'a' before initializationlet a = "第二代码块中的a"console.log(a) // "第二代码块中的a"}console.log(a) // "第一代码块中的a"
}
console.log(a) // 10
let b = 33function fn() {console.log(b) // 报错,Cannot access 'b' before initializationlet b = 44console.log(b) // 44function f1() {console.log(b) // 报错,Cannot access 'b' before initializationlet b = 55console.log(b) // 55}f1()
}fn()
练习1
var a = 1function fn() {a = 2console.log(a) // 2
}fn()
console.log(a) // 2
练习2
var a = 1function fn() {console.log(a) //undefinedvar a = 2console.log(a) // 2
}fn()
console.log(a) // 1
练习3
var a = 1function fn(a) {console.log(a) //undefineda = 2 // 修改的是形参console.log(a) // 2
}fn()
console.log(a) // 1
练习4
var a = 1function fn(a) {console.log(a) //10a = 2console.log(a) // 2
}fn(10)
console.log(a) // 1
练习5
var a = 1function fn(a) {console.log(a) //1a = 2console.log(a) // 2
}fn(a)
console.log(a) // 1
练习6
console.log(a) // a指向的是第五行的函数,var只是声明,并不赋值,如果声明过不会重复赋值var a = 1
console.log(a) // 1
function a() {alert(2)
}
console.log(a) // 1
var a = 3
console.log(a) // 3
var a = function () {alert(4)
}
console.log(a) // 打印11行函数
var a // 已经声明过了,根本不执行
console.log(a) // 打印11行函数