浅谈Javascript变量作用域,初学遇到的困惑(上)

**

1 变量声明

**
javascript是弱类型语言,声明变量的方式有三种:var、let、const 。
其中,var就是声明一个变量,可以是全局的变量,也可以是在函数里的局部变量;let是声明一个块作用域的局部变量,也就是作用域在大括号{}里的局部变量;const是声明一个块作用域里的不可写的(不可更改的)变量。
那么在这篇文章中,我只是想说明一下除了函数体外,在大括号里里的这种块级,是怎么区分全局变量和局部变量的(会适当的牛角尖)。
**

2 全局变量的声明

**
全局变量的声明是在script标签里函数体外面用var所定义的变量,示例如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>javascript</title>
<script type="text/javascript">
	var a = 6;
</script>
</head>
<body>
<script>
	alert(a);
</script>
</body>
</html>

这样在该html文档里,a在哪都能读取到,而有别的语言基础的同学可能就觉得这段代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script>
	while(true){
		var a = 1;
		break;
	}
	
	for(var i=0;i<2;i++){
		var b = 4;
	}
</script>
</head>
<body>
<script>
	console.log(a);
	console.log(i);
	console.log(b);
	//都是可以读到的!!!
</script>
</body>
</html>

这都是可以读到的,平且还可以在任意位置改写:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script>
	var a=5,i=10,b=15;
	while(true){
		var a = 1;
		break;
	}
	
	for(var i=0;i<2;i++){
		var b = 4;
	}
</script>
</head>
<body>
<script>
	console.log(a);
	console.log(i);
	console.log(b);
	//都是可以改到的,而且是全局变动
</script>
</body>
</html>

那么如果想在局部产生这种变量,并作用于局部怎么办呢。

2 局部变量

看下面示例代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script>
	while(true){
		let a = 1;
		console.log(a);  //能读到
		break;
	}
	//console.log(a);    //报错
	for(let i=0;i<2;i++){
		console.log(i);  //能读到,所以()不算一个块
		let b = 4;
		console.log(b);  //能读到
	}
	//console.log(b);    //报错
	//console.log(i);	 //报错
</script>
</head>
<body>
<script>
	//console.log(a);    //报错
	//console.log(i);    //报错
	//console.log(b);    //报错
</script>
</body>
</html>

在这里,用let声明之后,外面就读不到了,以下代码能更好的帮助理解:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script>
	var a=5,b=10,i=15;
	while(true){
		let a = 1;
		console.log(a);  // 显示:1
		break;
	}
	console.log(a);    //显示:5,读的是全局,let仅对块内起作用,重名也没关系
	for(let i=0;i<1;i++){
		console.log(i);  //显示:0
		let b = 4;
		console.log(b);  //显示:4
	}
	console.log(b);    //显示:10
	console.log(i);	 //显示:15
</script>
</head>
<body>
<script>
	console.log(a);    //显示:5
	console.log(i);    //显示:15
	console.log(b);    //显示:10
</script>
</body>
</html>

那么,当我们在括号内要改变a的值的时候,改变的是外面的a还是里面的a呢:

<script>
	var a=5,b=10,i=15;
	while(true){
		let a = 1;
		console.log(a);  // 显示:1
		a = 20;
		console.log(a);  // 特别注意:显示:20,改也是改的块里的a
		break;
	}
	console.log(a);    //显示:5,读的是全局,let仅对块内起作用,重名也没关系
</script>

所以在这里,在块内,我们改变的是块里let声明的a,而不是全局变量。

3 const声明

const是ES6提供的声明方法,也是块级的只可读作用域级的声明,那么对这个const声明我有以下转牛角尖的情况,请看:
第一种:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script>
	const a = 5;
	while(true){
		//a = 1; 		   //报错
		//var a = 7;	   //报错
		let a = 7;		   //这样是可以的,不报错
		console.log(a);    
		break;
	}
	//a = 3;               //报错
	console.log(a);		   //读的还是const声明的a
</script>
</head>
<body>
<script>
	console.log(a);      // 能读到
</script>
</body>
</html>

第二种:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script>
	const a = 5;           //全局的只可读的a
	while(true){
		const a = 7;	   //这样竟然也是可以的,代表他是这个块里的只可读的a
		console.log(a);    //打印出来是7
		break;
	}
	console.log(a);		   //读的是5
</script>
</head>
<body>
<script>
	console.log(a);       //读的是5
</script>
</body>
</html>

第三种:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script>
	/* 转牛角尖的情况~~~ */
	for(const i=9;;){
		console.log(i);  //能读到 
		break;
	}
	//console.log(i);	 //报错
</script>
</head>
<body>
<script>
	//console.log(i);    //报错
</script>
</body>
</html>

就是以上这三种啦~~~~
相信看完代码和注释能给初学者一个更清楚的认识

还有查阅过const声明的资料,其实const并不是不可变的,实际上const声明指向的是一个地址,这个地址指向一个对象

<script type="text/javascript">
	const a = new Array();
	a.push("a");
	a.push(1);
	a.push(2);
	a.push("b");
	a.push("cat");
	console.log(a.length);
	a.forEach(function(element,index){
		console.log(index+":"+element);
	});
</script>

这样是可以往里面传值的~~~~

本次分享就到这里了,都是自己总结的,如果有哪里不对的还请各位大佬指出,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值