作用域
- JavaScript作用域就是代码名字(一般是变量)在某个范围内起作用和效果。
- 作用:提高了程序逻辑的局部性, 增强了程序的可靠性,减少了名字冲突。
- JavaScript的作用域分为以下两种:
(1)全局作用域:在整个script标签或者一个单独的js文件内起作用
(2)局部作用域(函数作用域):只能在函数内部起效果和作用
全局变量和局部变量
- 根据作用域的不同,变量可以分为全局变量和局部变量。
(1)全局变量:在全局作用域下的变量,在全局下都可以使用,包括函数内部。并且,全局变量只有浏览器关闭的时候才会销毁,比较占内存资源。
(2)局部变量:在局部作用域下的变量,或者说成在函数内部的变量。并且,局部变量在程序执行完毕后就会立即销毁,比较节约内存资源。
注意:
(1)在函数内部没有声明就直接赋值的变量是全局变量
(2)函数的形参可以看作是局部变量
作用域链
- 作用域链:内部函数访问外部函数的变量,采取的是链式查找的方式来决定取哪个值。(就近原则)
var num = 22;
function fn(){ //外部函数
var num = 33;
function fun(){ //内部函数
console.log(num);
}
fun();
}
fn(); //输出结果是:33
拓展(块级作用域)
- 在ES6之前是没有块作用域的概念,而ES6中新增了块级作用域。
- 任何一对花括号({})中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域。在ES6中只要{}没有和函数结合在一起,那么应该就是“块级作用域”。
- 块作用域由 { } 包括,if语句和for语句里面的{ }也属于块作用域。
- 在块级作用域中,var定义的变量是全局变量,let定义的变量是局部变量。而在局部作用域中,无论是用var定义的变量还是用let定义的变量都是局部变量。
- 无论是在块级作用域还是局部作用域,省略变量前面的var或者let都会变成一个全局变量。