对于 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 ,而 aconsole.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