(1)变量作用域:所谓变量作用域就是指程序源代码中变量定义的区域。分为全局变量和局部变量。函数参数或在函数内定义的变量都属于局部变量。
(2)函数作用域:指函数内声明的所有变量在函数体内始终是可见的。并且这些定义的变量在函数中会被“声明提前”(代码在执行之前,这些定义的变量已经被提升到代码的最顶部,只包含变量声明,不包括赋值)。
var s = "hello";
function f(){
console.log(s);//undefined
var s = "world";
console.log(s);//world
}
f();
console.log(s);//hello
/*可以理解为:*/
/**
function f(){
var s;
console.log(s);
s = "world";
console.log(s);
}
*/
(3)块级作用域:位于花括号内定义的代码所具有的作用域称为块级作用域。并且变量在声明它们的代码块之外不可见。JavaScript中没有块级作用域,取而代之的是函数作用域。
例:
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 6
使用let声明的变量只在块级作用域内有效,每次循环 i 都是一个新的变量。
for循环中设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。