引入
什么是作用域?
一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
全局作用域
JS中没有明确的全局作用域的概念,只有局部作用域以及全局执行环境的概念,全局执行环境被认为是window对象,是最外围的一个执行环境。因为作用域的概念只是给后续声明语句的阐述做一个铺垫,所以这里就不赘述了。
局部作用域
在外部无法访问局部作用域中的变量
1、函数作用域
变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的。在函数中声明的变量只能在函数内部访问。
function fn(){
var a = 1;
}
fn()
console.log(a)//ReferenceError: a is not defined
function fn(){
let a = 1;
}
fn()
console.log(a)//ReferenceError: a is not defined
在函数作用域中有一个特殊情况
function fn(){
a = 1;
}
fn()
console.log(a)//1
在函数中没有声明,直接赋值一个变量时,这个变量会在函数执行之后成为一个全局变量。
2、块级作用域(ES6)
{}内部就是一个块级作用域,ES5中没有块级作用域的概念,块级作用域的概念是在ES6中出现的。
块级作用域的概念只和let/const所声明的变量有关,与var声明的变量无关。
{
let a = 1;
var b = 2;
}
console.log(a);//a is not defined
console.log(b);//2
声明变量的方式
1. var
在函数作用域或全局作用域中通过关键字var声明的变量,无论在哪里声明的,都会被当成在当前作用域顶部声明的变量。这就是我们常说的变量提升。
function fn(){
if(false){
var a = 1;
}else{
console.log(a)//undeined
}
}
fn();
等价于
function fn(){
var a;
if(false){
a = 1;
}else{
console.log(a)//undeined
}
}
fn();
var</