作用域分为全局作用域,局部作用域以及块作用域。
1.全局作用域。
全局(在函数之外)声明的变量拥有全局作用域。
全局变量可以在 JavaScript 程序中的任何位置访问。
var carName = "porsche";
// 此处的代码(外部代码)可以使用 carName
function myFunction() {
// 此处的代码(内部代码)也可以使用 carName
}
2.局部(函数)作用域
局部(函数内)声明的变量拥有函数作用域。
只能在声明的函数内部使用,外部不可用。
// 此处的代码不可以使用 carName
3.块作用域
(1)通过 var
关键词声明的变量没有块作用域。
在块 { } 内声明的变量可以从块之外进行访问。
{ var x = 10; } // 此处可以使用 x
(2)可以使用 let
关键词声明拥有块作用域的变量。
在块 { } 内声明的变量无法从块外访问
{ let x = 10; } // 此处不可以使用 x
4.重新声明变量
(1)使用 var
关键字重新声明变量会带来问题。
在块中重新声明变量也将重新声明块外的变量
var x = 10; // 此处 x 为 10 { var x = 6; // 此处 x 为 6 } // 此处 x 为 6
(2)使用 let
关键字重新声明变量可以解决这个问题。
在块中重新声明变量不会重新声明块外的变量
var x = 10; // 此处 x 为 10 { let x = 6; // 此处 x 为 6 } // 此处 x 为 10
(3)在相同的作用域,或在相同的块中,通过 let
重新声明一个 var
变量是不允许的,可以在不同的作用域里重新声明。
5.循环作用域
在循环中使用 var
:
var i = 7; for (var i = 0; i < 10; i++) { // 一些语句 } // 此处,i 为 10
在循环中使用 let
:
let i = 7; for (let i = 0; i < 10; i++) { // 一些语句 } // 此处 i 为 7
6.var和let的区别
(1)它们都有全局和局部作用域
(2)var定义的全局变量属于window对象,let定义的全局变量不属于
(3)在相同的作用域或块中,var和let不允许相互重新声明,不同的作用域或块允许。
(4)通过var声明的变量可以提升到顶端,let不会。