[js点滴]JavaScript中的作用域及作用域链的意义和解释

#一.作用域

简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。
##在JavaScript中,变量的作用域有:

##1.局部作用域

和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所有在一些地方也会看到有人把这种作用域称为函数作用域
##2.全局作用域
在代码中任何地方都能访问到的对象拥有全局作用域,一般来说以下几种情形拥有全局作用域:
##3.JavaScript的作用域链


var a  = 12;
function test(){
	var b = 23;
	
	function test1(){
		var c = 45;
		alert(a);
	}
	test1();//调用test1函数
}
test();//调用test()函数

解释:1.alert(a)中的a首先在test1函数里面去找,看有没有定义a这个变量,找到,就使用其中的定义的变量a;
2.如果没找到,则会继续在test中去找,有就使用;
3.如果还是没找到,就会继续向上找(全局对象)查找是否定义了a,找到了就使用.
#作用域链定义
作用域链:JavaScript需要查询一个变量x时,首先会查找作用域链的第一个对象,如果以第一个对象没有定义x变量,JavaScript会继续查找有没有定义x变量,如果第二个对象没有定义则会继续查找,以此类推。
上面的代码涉及到了三个作用域链对象,依次是:test1、test、window。
*/

##2、函数体内部,局部变量的优先级比同名的全局变量高。

var a1 = 23;
function test3(){
	var a1 = 34;
	alert(a1);//34
}

##3、JavaScript没有块级作用域。

var a2 = 12;
if(true){
	var a3 = 13;
	for (var a4 = 12;a4 < 15;a4++) {
		console.log(a4);
	}
}
//a2,a3,a4作用域是一样的

##4、函数中声明的变量在整个函数中都有定义。

var a5 = 12
function test4(){
	var a6 = 100;
	function test5(){
		a6 = 200;
	}
}
//上面得代码说明了,变量a6在整个test4函数体内都可以使用,并可以重新赋值	

###这是由于在函数test6内局部变量x在整个函数体内都有定义( var a7= 10000,进行了声明),所以在整个test6函数体内隐藏了同名的全局变量a7。这里之所以会弹出’undefined’是因为,第一个执行alert(x)时,局部变量x仍未被初始化。

var a7 = 100;
function test6(){
	alert(a7);
	var a7 = 10000;
	alert(a7);
}
/*等价于
 *function test6(){
 	var a7;
	alert(a7);
	a7 = 10000;
	alert(a7);
} 

##5、未使用var关键字定义的变量都是全局变量。

function test7(){ 
a8 = 100; //声明了全局变量x并进行赋值 
} 
alert(a8);
//这也是JavaScript新手常见的错误,无意之中留下的许多全局变量。 

##6、全局变量都是window对象的属性

var a9 = 100 ; 
alert( window.a9 );//弹出100 
alert(a9); 
//在<script>
//标签里面,直接定义的变量,就是全局的window对象的变量
//处处可以调用也。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图解AI

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值