对于 JavaScript 中的全局变量和局部变量,分为隐式声明和显示声明。
全局变量
1.使用 var 关键字在函数外部声明的变量,为全局变量(显示声明)
2.在函数内部,没有使用 var 声明的变量,也为全局变量(隐式声明)
3.使用 window 全局对象来声明的变量,也为全局变量 `window.a = 1;`(显示声明)
局部变量
1.在函数内部使用 var 关键字声明的变量,为局部变量(显示声明)
2.函数的参数列表中的形参,为局部变量(隐式声明)
全局变量与局部变量的关系
在函数内部可以访问全局变量,在函数外部不可以访问局部变量
下面写一些实例来熟悉一下全局变量和局部变量的应用:
- 实例1:
var a = 123;
function fun(){
console.log(a);
}
fun();
运行结果:123
解释:
实例1中,
a
在全局作用域下使用var
关键字声明了,是全局变量,而当我们fun()
执行函数时,fun
函数内部的打印语句就会访问到全局变量a
,所以,打印出来123
。
- 实例2
var a = 123;
function fun(){
console.log(a);
var a = 456;
}
fun();
console.log(a);
运行结果:undefined 123
解释:
首先,我们可以知道,全局变量
a
的值是123
,而函数fun
内部的局部变量a
的值为456
,但是这里我们要注意,函数内部的console.log(a);
是写在给var a = 456;
之前的。由于变量声明提升,我们此时在函数内部的顶部相当于先var a;
声明了a
,但是赋值语句是不会提升的(有疑惑的可以看我的主页的函数声明与变量声明提前),所以把没有赋值的a
给打印出来了,由于没有赋值,为undefined
。
有些读者可能会说,怎么不能使用全局变量a=123;
呢,那是因为,在函数内部,如果声明了同名的变量,则会使用函数内部的局部变量,而不会访问全局变量,所以只能是访问函数本身的变量a
,而a
在console.log(a);
之前没有赋值,所以是undefined
。
后面一个console.log(a);
更简单,由于在函数外部是访问不到局部变量的,所以访问全局变量a
,打印出来123
。
- 实例3
var a = 123;
function fun(){
console.log(a);
a = 456;
}
fun();
console.log(a);
运行结果:123 456
解释:
首先,明确一点,在函数内部没有使用
var
关键字声明的变量,会隐式的声明为全局变量,所以函数内部的a
为全局变量,由于console.log(a);
在a=456;
之前,所以console.log(a);
访问全局变量中的a
时,a
的值为123
,所以先打印出123
。
而后的console.log(a);
被后面的全局变量a=456
重新赋值了,所以打印出来456
。
- 实例4
var a = 123;
function fun(a){
console.log(a);
a = 456;
}
fun(123);
console.log(a);
运行结果:123 123
解释:
首先,我们可以看到,函数
fun
是传了一个参数a
的,所以按照前面的定义,这里的a
会被隐式的声明为局部变量,所以第一个console.log(a);
打印的是传入的实参,即123
。
而第二个console.log(a);
只是打印全局变量a
的值,为123
。