变量作用域
JS是函数级作用域编程语言:变量只在其定义时所在的function内部有意义;
function fun() {
var a = 10; // a是局部变量
console.log(a); // 10
}
fun();
console.log(a); // 报错:Uncaught ReferenceError: a is not defined
全局变量
如果不将变量定义在任何函数的内部,此时这个变量就是全局变量,它在任何函数内都可以被访问和更改;
var b = 10; // b是全局变量
function fun2() {
b++;
console.log(b); // 11
}
fun2();
console.log(b); // 11
遮蔽效应
如果函数中也定义了和全局同名的变量,则函数内的变量会将全局的变量“遮蔽”;
// 全局变量
var a = 10;
function fun() {
// 局部变量,会把全局的变量a遮蔽
var a = 5;
a++;
console.log(a);
}
fun();
console.log(a);
形参也是局部变量
var a = 10;
function fun(a) {
a++;
console.log(a); // 8
}
fun(7);
console.log(a); // 10
作用域链
函数的嵌套
一个函数内部也可以定义一个函数;和局部变量类似,定义在一个函数内部的函数是局部函数;
function fun() {
function inner() {
console.log('你好');
}
inner();
}
fun();
作用域链
在函数嵌套中,变量会从内到外逐层寻找它的定义;
var a = 10;
var b = 20;
function fun() {
var c = 30;
function inner() {
var a = 40;
var d = 50;
console.log(a, b, c, d); // 40 20 30 50
}
inner();
}
fun();
不加var将定义全局变量
在初次给变量赋值时,如果没有加var,则会定义全局变量;
function fun() {
a=3;
}
fun();
console.log(a); // 3