8、函数作用域

一、函数作用域

函数作用域和局部作用域相当于局部和全局的关系(个体和整体的关系)

  • 全局作用域在打开页面时就起效,在关闭页面时销毁。

  • 局部作用域在调用时,创建函数作用域,函数执行完以后,函数作用域销毁,每调用一次函数就创建一个函数作用域。他们之间是独立的。

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

猜你喜欢

转载自blog.csdn.net/weixin_39704454/article/details/81102287