在es5中变量作用域分为两种:全局变量,局部变量;
局部变量:写在函数体内部,其中函数中所传递的参数也是局部变量(小括号中的),仅在定义的部分能够使用;
全局变量:写在函数体外部的变量,其中在函数中使用但未用var声明的变量也是全局变量,可以在全局中任何部分使用;
下面是关于变量作用域的小案例:
全局变量
(1)直接声明
var a = 10;
console.log(a) // 10
(2)在{ }中声明
例如在一个if条件语句中定义了一个变量c, 在程序执行过程中,没有执行到这条语句,但是在条件语句外部依旧可以输出这个变量。此时变量c进行的作用域的提升,在条件语句外定义变量,在判断语句中进行赋值。
var b=4;
if(b>5){
var c=9;
}else{
console.log(b) // 4
}
console.log(c) // undefined
提升后
var b=4;
var c;
if(b>5){
c=9;
}else{
console.log(b) // 4
}
console.log(c) // undefined
(3)在函数体中使用但并未声明
例如:在函数内部有一个a=10;但是a没有用var声明;此时a为全局变量,相当于调用这个函数的时候在全局外定义变量a,在函数中进行赋值。若函数没有被调用则a不会在全局中被声明。
function demo(){
a = 10;
}
console.log(a); // 报错
demo();
console.log(a); // 10
相当于:
var a;
function demo(){
a = 10;
}
console.log(a); // undefined
demo();
console.log(a); // 10
局部变量
局部变量仅仅在声明的部位能够调用,其他位置不能访问。
(1)在函数体内部声明
function demo(){
var a = 10;
console.log(a) // 10
}
console.log(a); // 报错
demo();
console.log(a); // 报错
(2)在函数体内部声明中的参数
function demo(a){
a = 10;
console.log(a) // 10
}
console.log(a); // 报错
demo();
console.log(a); // 报错
总结:
在定义变量的时候,需要考虑作用域的问题,尤其是在函数中,建议多使用局部函数,因为函数只用在调用的时候才被创建,使用完毕就会被销毁,不会一直占用内存,而全局变量不会关心你是否使用,只要定义了就会一直存在,知道关闭浏览器才会被销毁,比较占用内存。