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 initialization
let a = "第一代码块中的a"
console.log(a) // "第一代码块中的a"
{
console.log(a) // 报错,Cannot access 'a' before initialization
let a = "第二代码块中的a"
console.log(a) // "第二代码块中的a"
}
console.log(a) // "第一代码块中的a"
}
console.log(a) // 10
let b = 33
function fn() {
console.log(b) // 报错,Cannot access 'b' before initialization
let b = 44
console.log(b) // 44
function f1() {
console.log(b) // 报错,Cannot access 'b' before initialization
let b = 55
console.log(b) // 55
}
f1()
}
fn()
练习1
var a = 1
function fn() {
a = 2
console.log(a) // 2
}
fn()
console.log(a) // 2
练习2
var a = 1
function fn() {
console.log(a) //undefined
var a = 2
console.log(a) // 2
}
fn()
console.log(a) // 1
练习3
var a = 1
function fn(a) {
console.log(a) //undefined
a = 2 // 修改的是形参
console.log(a) // 2
}
fn()
console.log(a) // 1
练习4
var a = 1
function fn(a) {
console.log(a) //10
a = 2
console.log(a) // 2
}
fn(10)
console.log(a) // 1
练习5
var a = 1
function fn(a) {
console.log(a) //1
a = 2
console.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行函数