58----JS基础-----全局作用域(全局作用域与变量、函数的声明提前)

一 代码

1 全局作用域

这个比较好理解,就是声明的变量都是全局的,并且保存在页面window对象中,作为window的属性。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
			
			/*
			 * 1. 作用域
			 * 	- 作用域指一个变量的作用的范围
			 * 	- 在JS中一共有两种作用域:
			 * 		1.全局作用域
			 * 			- 直接编写在script标签中的JS代码,都在全局作用域
			 * 			- 全局作用域在页面打开时创建,在页面关闭时销毁
			 * 			- 在全局作用域中有一个全局对象window,
			 * 				它代表的是一个浏览器的窗口,它由浏览器创建我们可以直接使用
			 * 			- 在全局作用域中:
			 * 				创建的变量都会作为window对象的属性保存
			 * 				创建的函数都会作为window对象的方法保存
			 * 			- 全局作用域中的变量都是全局变量,
			 * 				在页面的任意的部分都可以访问的到
			 * 
			 * 		2.函数作用域
			 * 
			 */
			
			var a = 10;
			var b = 20;
			//var c = "hello";
			
			//console.log(window.c);
			
			function fun(){
      
      
				console.log("我是fun函数");
			}
			
			//window.fun();
			
			//window.alert("hello");
			
			
		</script>
	</head>
	<body>
	</body>
</html>

2 变量、函数的声明提前

js的声明与C/C++不一样,js的声明即使你在代码中写在使用之后,它也不会报错。因为js解析器会帮你将程序所有的变量的声明提前。

具体看下面例子即可。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
			
			
			/*
			 * 1. 变量的声明提前
			 * 	- 使用var关键字声明的变量,会在所有的代码执行之前被声明(但是不会赋值),
			 * 		但是如果声明变量时不适用var关键字,则变量不会被声明提前
			 * 
			 * 2. 函数的声明提前
			 * 	- 使用函数声明形式创建的函数 function 函数(){}
			 * 		它会在所有的代码执行之前就被创建,所以我们可以在函数声明前来调用函数。
			 * 	- 使用函数表达式 var fun2 = function(){}; 创建的函数,虽然会被声明提前,但是由于未创建,
			 * 		所以不知道它的数据类型(undefined),故不能直接当做函数来调用,会报错,所以使用函数表达式不能在声明前调用。
			 * 		注:他本来写的是使用函数表达式"不会被声明提前",但视频是会被声明提前,所以应该是写错了。
			 */

			// 一 测试变量的声明提前
			console.log("a = "+a);			// 提前使用a不会报错,但是会输出:a = undefined
			var a = 123;
			// 上面两行被解析器解析后等价于:
			// var a;
			// console.log("a = "+a);
			// a = 123;

			// 二 测试函数的不同创建方法,验证函数的声明提前
			fun();							// 输出:"我是一个fun函数"
			//函数声明,会被提前创建
			function fun(){
      
      
				console.log("我是一个fun函数");
			}
			
			console.log(typeof fun2);		// 输出:undefined
			//fun2();						// 直接报错,因为是undefined,解析器不知道你是否是函数,故不能当做函数调用,但确实被提前声明了,只不过没有创建。
			//函数表达式,不会被提前创建
			var fun2 = function(){
      
      
				console.log("我是fun2函数");
			};
			
		</script>
	</head>
	<body>
	</body>
</html>

实际开发中,我们按照正常的声明、调用顺序,就不会出现这种问题了。

猜你喜欢

转载自blog.csdn.net/weixin_44517656/article/details/121322106
今日推荐