javascript ES6变量的作用域
1. 全局
2. 局部
3. 块
例1
let a = 123 ; // 全局变量
const b = 3 ; // 全局常量
var c = 0 ; // 全局变量
console.log(c) // 0
// console.log(d) // not defined
function test(e = 1)
{
// 或者 let d, 对于整个js文件来说 d 的作用域为test方法体中,
// 若外部有同名变量 和它无关 除非省略关键字 var / let 才是全局变量
var d ;
// e 为参数 根据就近原则 a、b变量先扫描 test方法中是否有定义,
// 没有则向父级作用域找 再找不到就报未定义 not defined
d = a + b * e ;
console.log(`in function: a = ${a}, b = ${b}, c = ${c}`) ;
console.log(`in function: d = ${d}\n\n`) ;
return d ;
}
// 将方法 test(5) 返回值 赋给 c
c = test(5) ; // 138
console.log(`outer: a = ${a}, b = ${b}, c = ${c}`) ;
// 当前作用域(此时作用域 为全局) 为定义 d 这个变量
// 报 d is not defined
console.log(`outer: d = ${d}`) ;
例2
// 块级作用域
if (true) {
let a = 100
}
// console.log(a) // a is not defined
{
// 类似 静态代码块 命名空间等概念
let b = 12
}
// console.log(b) // b is not defined
for (let ii = 0; ii < 5; ii++) {
// 题外话
// 用 let 不用var可以解决闭包传参时丢失的问题
// 经典面试题 将 var 改为 let 输出 0 1 2 3
// for (var jj = 0; jj < 4; jj++) {
// setTimeout(()=>{
// console.log(jj);
// }, 10)
// }
}
// console.log(ii) // ii is not defined