全局作用域
- 变量在函数、{}外定义的,即为全局变量
- 全局变量有全局作用域:网页中的所有脚本和函数均可以使用
let carName = "Volvo";
function myFunction()
{
console.info( carName ); // 此处可调用 carName 变量
}
myFunction() ; // "Volvo"
注意:全局变量在全局作用域上,任何函数和代码段都可以访问,甚至修改它的值。
局部作用域
- 局部作用域,又称函数作用域,是通过一个函数形成的作用域。(变量在函数内声明,变量就只在函数内部有效。)
let carName = "BMW"; //全局变量
function myFunction()
{
let carName = "Volvo";
console.info( carName ); // Volvo 局部变量
}
myFunction();
console.info( carName ); // BMW
<!-------------------------------------!>
<!-------------------------------------!>
<!-------------------------------------!>
function myFunction()
{
let carName = "Volvo"; // 函数内可调用 carName 变量
}
myFunction();
console.info( carName ); // 报错 123456
注意:若全局变量与局部变量冲突,则局部变量会覆盖全局变量
let carName = "BMW"; // 全局变量
function myFunction()
{
carName = "Volvo"; // 这个 carName 是全局变量。它更改了全局变量的值。
}
myFunction() ;
console.info( carName ); // Volvo
块作用域
ES6 中新增了块级作用域,能约束 let ,const 定义的变量,常量。 块作用域由 {}包裹代码,代码在
{}中就行成了一个作用域空间。在这个空间里,let / const 定义的变量 / 常量只在这对{}里有效,
在外部是没法访问的。
{
var a = 1;
console.log(a); // 1
}console.log(a); // 1
// 可见,通过var定义的变量可以跨块作用域访问到
{ let a = 1;
console.log(a); // 1
}
console.log(a); // 报错。let 定义的变量,无法跨块作用域访问。
注意:if语句和for语句里面的{ }也属于块作用域。
if(true) {
var c = 3;
}
console.log(c); // 3
for(var i = 0; i < 4; i++) {
var d = 5;
};
console.log(i); // 4 (循环结束i已经是4,所以此处i为4) console.log(d); // 5
// if语句和for语句中用var定义的变量可以在外面访问到
if(true) {
let c = 3;
}console.log(c); // 报错
for(let i = 0; i < 4; i++) {
let d = 5;
};console.log(i); // 报错 console.log(d); // 报错
// if语句和for语句中用 let 定义的变量在外面访问不到, 1234567891011