一、函数作用域
函数作用域和局部作用域相当于局部和全局的关系(个体和整体的关系)
-
全局作用域在打开页面时就起效,在关闭页面时销毁。
-
局部作用域在调用时,创建函数作用域,函数执行完以后,函数作用域销毁,每调用一次函数就创建一个函数作用域。他们之间是独立的。
function fun(){
console.log(1)
}
fun();
fun();
fun()
//这里调用了三次,一共创建了三个函数作用域,他们都是相互独立的。
- 在函数作用域中可以访问到全局作用中的变量
var a=10;
function fun(){
console.log(a);
}
fun();
- 在全局作用域中无法访问局部作用域中的变量
function fun(){
var b=20;
}
console.log(b)//Uncaught ReferenceError: b is not defined
当在函数作用域中操作一个变量时,他先会在自身作用域中找,如果有直接使用,如果没有则从上一级寻找,直到找到全局作用域中的变量为止,找不到的会报错(ReferenceError)
//就近原则,谁近找谁
var a=10;
function fun(){
var a="我是函数中的的局部变量a";
console.log(a);
}
fun();//我是函数中的的局部变量a
console.log(a)//10
function fun2(){
var b=15;
function fun3(){
console.log(b)//fun3在自己的作用域找不到b,她就会往上一级寻找b。
}
fun3()
}
fun2()//15
- 在函数作用域中,如果不想用就近原则,想要直接访问a,就可以直接用window.a
var a="我是window的a"
function fun2(){
var a=15;
function fun3(){
console.log(window.a)
}
fun3()
}
fun2()//我是window的a
二、函数声明提前
- 在函数作用域中也有提前声明的特征,使用var关键字声明的变量,会在函数中所有的代码执行之前被声明
function fun3(){
console.log(a);
var a=0;
}
fun3()//undefined
//相当于
function fun3(){
var a;
console.log(a);
a=10;
}
fun3()//undefined
- 在函数作用域中,也有声明提前的特征。使用函数声明的函数也会在所有的代码执行之前执行
function fun3(){
fun4();
function fun4(){
console.log("我是函数声明的fun4,我会在所有的代码执行之前被声明了")
}
}
fun3()//我是函数声明的fun4,我会在所有的代码执行之前被声明了
- 在函数中,不使用var声明的变量都为全局变量,定义形参的函数在传参的时候相当于在函数中声明一个变量。
function fun5(e){
console.log(e);
}
fun5()//因为没传递任何参数,所以形参的值是 undefined。所以结果是: undefined
fun5(6)//6
传递参数:
var a=123;
function fun(a){
console.log(a)//这里的a相当于传入来的a
a=456;//给新传入的a赋值
}
fun(123);//123
console.log(a)//123
不传递参数的情况:
var a=123;
function fun(){
console.log(a)//这里的a会往上一级寻找a。找到a为123
a=456;//给a赋值为456
}
fun(123);//123
console.log(a)//456