6.JS基础的学习——06day

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

1.全局作用域(Scope)

2.变量的提前声明

3.函数的(局部)作用域

4.debug的使用

5.函数的练习

6.this的使用

7.this的补充说明

8.使用方法创建工厂

9.test

总结


 

1.全局作用域(Scope)

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<script type="text/javascript">
			/*
			 作用域(作用区域)
			 *  - 作用域值得是一个变量的作用范围
			 * 	- 在JS中一共有两种作用域:
			 * 		1.全局作用域
			 * 			- 直接编写script标签中的JS代码,都在全局作用域
			 * 			- 全局作用域在页面打开时创建,在页面关闭时销毁(那就在不同页面可以用同一个名字)
			 * 			- 在全局作用域中有一个全局对象window
			 * 				它代表的是一个浏览器的窗口,它由浏览器创建我们可以直接使用
			 * 			- 在全局作用域中
			 * 				创建的变量都会作为window对象的属性保存
			 * 				创建的函数都会作为window对象的方法保存:也就是说函数的调用实际上就是window方法的调用
			 * 			- 全局作用域中的变量都是全局变量
			 * 				在页面得任意得部分都可以访问的到
			 * 			举例:相当于教室黑板,谁进来都可以看得到黑白,故黑板是一个抽象的全局变量
			 * 				
			 * 
			 * 
			 * 		2.函数的作用域(局部作用域)
			 * 
			 * 
			 * 
			 */
			/*function fun(){
				var a = 123;//a的作用范围只能在函数中
				
			}
			fun();*/
			//fun();同等于 window.fun();
			//console.log(a);
			/*举例一:
			 	全局作用域中的变量都是全局变量
			 * 	在页面得任意得部分都可以访问的到
			 * */
				var a = 10;
				var b = 20;
				//var c = "hello";
				//console.log(window.c);变量都会作为window对象的属性保存
				function fun(){
					console.log("我是fun函数");
				}
				fun();
				//fun();同等于 window.fun(); window的fun()方法调用
			
			
			
		</script>
	</head>
	<body>
		
	</body>
</html>

2.变量和函数的提前声明

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
		//方法二:
			//var a;
			/*
			 变量的声明提前
			 *  - 使用var 关键字声明的变量,会在所有的代码之前被声明 (只是声明不会赋值)
			 * 		但是如果声明变量时不使用var关键字,则变量不会被声明提前
			 * 
			 * ctrl+方向上下键挪动代码行
			 * */
			//console.log("a = "+a);//显示 undefined
		//方法一://var a = 123//如果不写var 就相当于window.a = 123 
				
			//a = 123;//方法二提前声明了
			
			
			
			/*
			 函数的声明提前
			 * 一般形式创建的函数:
			 * 	 - 使用函数的声明形式创建的函数function 函数名(){}
			 * 		   它会在所有的代码行执行之前就被创建,所以我们可以在函数声明之前来调用函数
			 * 
			 * 字面量创建的函数:
			 * 	 - 使用函数表达式创建的函数,不会被声明提前,所以不能在声明提前调用
			 * 		得先把函数赋值给变量之后 再调用函数
			 * 			var fun2 = function(){}
			 * 				fun2();
			 * 
			 * */
			
			fun();//显示:我是一个fun函数
			fun2();//显示: undefined
			//函数声明    会被提前创建
			function fun(){
				console.log("我是一个fun函数");
			}
			//函数表达式  不会被提前创建
			var fun2 = function(){
				console.log("我是一个fun2函数");
				//使用这个函数表达式,var fun2;会被在上面提前声明,但是是在39行才开始赋值的
				//是先执行了fun2();再赋值的,所以会显示undefined
			};
			/*fun();//显示:我是一个fun函数
			fun2();//显示: 我是一个fun2函数*/
			
			
			
		</script>
	</head>
	<body>
	</body>
</html>

3.函数的(局部)作用域

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
			/*
			 函数作用域
			 * - 调用函数时创建函数的作用域,函数执行完毕以后,函数作用域销毁
			 * - 每调用一次函数就会创建一个新的函数作用域域,他们之间是相互独立的(每调用一次执行一次)
			 * - 在函数作用域中可以访问到全局作用域的变量
			 * 		在全局作用域 当中 无 法访问到 函数作用域内部中的变量
			 * 总结:从里面可以看到外面,从外面看不到里面
			 * 
			 * - 当在函数作用域中操作一个变量时(举例二),
			 * 		它会先在自身作用域中寻找,如果有就可以直接使用。
			 * 		没有的话就采用就近原则,往上一级找直到找到全局作用域
			 * 		如果全局作用域中依然没有找到,则会报错ReferenceError引用异常
			 * - 在函数作用域当中,没有使用window就是局部的,使用window是全局的值
			 */
			//创建一个全局变量
			/*var a =10;
			
			function fun(){
				
				console.log("a=" +a);
				
			}
			
			fun();
			//fun(); 函数作用域是相互独立的
			//fun(); 整体当中的一个局部
			//fun();*/
			
			/*
			 就近原则举例一
			 * */
				/*var a =10;
			
				function fun(){
					
					var a="我是函数中的变量a";
				
					console.log("a=" +a);//显示:a=我是函数中的变量a
				}
				fun();
				console.log("a=" +a);//显示:a=10;
			*/
			 /*就近原则举例二:从本身往上找的*/
			
				var a =10;
			
				function fun(){
					
					var a="我是函数中的变量a";
				
					function fun2(){
						//这样可以找到局部变量的值
						console.log("a=" +a);//显示:a=我是函数中的变量a
						//如果上一级没有var a="我是函数中的变量a";
						//直接输出 a = 10;
						
						//但是我就是想找到上面哪个全局变量的值,所以
						console.log("a=" +window.a);//使用全局变量的对象调用就可以    显示10
						
					}
					fun2();
				}
				fun();
				//console.log("a=" +a);//显示:a=10;
				
				
			/*带var 的变量调用
			  在函数作用域当中也有声明提前的特性
			 	   使用var关键字来声明变量,会在函数中所有的代码块执行之前被声明	
			 */
			/*function fun3(){
				//相当于 var a;没有赋值 有a但是没有赋值
				console.log(a);//输出:undefined
				var a =35;
				//相当于 a= 35
			}
			fun3();*/
			
			
			
			/*函数声明前调用
			 		其实fun4就相当于一个小的全局作用域
			*/
			/*function fun4(){
				fun5();//在函数声明前调用
				var a =35;
				function fun5(){
					alert("i'm fun5");
				}
			}
			fun4();*/
			//生命周期比较短。使用时间短,调用完了就销毁了。fun4();
			
			
			/*
			 在函数中,不使用var声明的变量都会成为全局变量
			 * window.名
			 * */
			var c =33;
			function fun6(){
			/*情况一*/	//var c;有一个隐藏和没有赋值的c
				//console.log("c = "+c);//就会显示undefined
				//var c = 10;
			/*情况二*/
				console.log("c = "+c);
				c = 10;//没有使用var声明,所以表示没有c。直接找上一级,输出 c=33
			}
			fun6();
			
			/*情况三,全局输出 当 没有声明var的时候,所以声明c = 10 的时候就是等于 window.c=10变为全局变量了*/
			console.log("c = "+c);//显示33 和 10
			
			/*举例四:有形参的时候*/
			/*function fun7(e){
				//var e;相当于声明了变量
				alert(e);//显示undefined
			}
			fun6();*/
		</script>
	</head>
	<body>
	</body>
</html>

4.debug的使用

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
			
			/*
			 debug 断点调试
			 		浏览器运行  - 脚本 - 选择断点行 - 点击单点跳过 - 看右边的变量值发生的变化
			 * 
			 * 
			 * 
			 * 
			 * 
			 * */
			//a b d 会提前声明变量
			alert(d);
			
			var a = 10 ;
			
			var b = "hello";
			
			c = true;
			
			function fun(){
				alert("hello");
			}
			var d = 35;
		</script>
	</head>
	<body>
	</body>
</html>

5.函数的练习

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
			/*
			 说出以下代码的执行结果咯
			 * 
			 * 
			 */
		/*1.------------*/
			/*var a = 123;
			function fun(){
				alert(a);
			}
			fun();
			结果:123
			* */
		/*2.------------*/
			/*var a = 123;
			function fun(){
				/ var a;默认
				alert(a); //undefined
				var a =456;
			}
			fun();
			alert(a);//显示123
			结果: undefined 123
			
			函数内部可以使用全局变量
			全局变量不能使用内部函数数据
			* */
		/*3.------------*/
			/*var a = 123;
			function fun(){
				alert(a);//显示123  上一级a=123
				a = 456;//没有var 默认为 window.a=456全局变量
			}
			fun();
			alert(a);//显示456   上一级a=456
			结果:  123  456

			都变为全局变量,按照就近原则,找上一级最近的
			*/
		/*4.------------*/
			/*var a = 123;
			function fun(a){
				alert(a);//undefined
				a = 456;//这里括号里有一个形参a就表示着  在函数里面声明了var a;
			}
			fun();
			alert(a);//显示123
			结果:undefined  123 (括号里有一个形参a就表示着 a是内部函数的值了  不能用了)
			* 
			*/
		/*5.------------*/
			/*var a = 123;
			function fun(a){
				alert(a);//显示123
				a = 456;//这里a = 456已经变为函数内部的值了 在前已经声明var了,不属于全局变量了
			}
			fun(123);
			alert(a);//显示123
		*/
		
		
		
			
			
		</script>
	</head>
	<body>
	</body>
</html>

6.this的使用

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
			/*
			 	解析器在调用函数每次都会向函数内部传递进一个隐含的参数
			 		这个隐含的参数就是this,this指向的是一个对象
			 		这个对象我们称为函数执行的上下文对象(this指向)
			 		根据函数的调用方式的不同,this会指向不同的对象
			 			 1.以函数的形式调用时,this永远都是window
			 			 2.以方法的形式调用时,this就就是调用方法的那个对象
			 * 
			 * 
			 * */
			
			function fun(){//(a,b)
				//console.log("a= "+a+ ",b="+b); 显示undefined
				console.log(this.name);//浏览器给我们传过来的
				
				/*复习:
				 * 	    现在的this指的是 obj 或者 obj2 
				 * 
				 * 	    调用哪一个this指向的就是哪一个
				 * 
				 */
				
				
				
				
			}
			
		/*一句话:this就像  在当前的fun中指哪打哪*/
		/*举例一:对象的this  根据环境来使用this*/
			//创建一个对象
			var obj = {
				name:"孙悟空",
				sayName:fun
			};
			//console.log(obj.sayName == fun);//显示true
			//fun();//显示:window
			var obj2 = {
				name:"猪八戒",
				sayName:fun
			};
			/*对象的name属性:
			 	以方法的形式调用,this是调用方法的对象(obj)
			 */
			  obj.sayName();//显示孙悟空
			  obj2.sayName();//显示猪八戒
		/*复习*/
			  //和this.name有关系,也就是说this调用对象是不固定的,执行哪个就调动哪个
		
		
		/*举例二:全局的this  根据环境来使用this*/
			
			var name = "全局的name属性";
			//以函数的形式调用 this是window
			fun();//显示     全局的name属性
			//等于 window.fun(); 这样就会有了this指哪打哪的作用
		
		
		
		
		
		</script>
	</head>
	<body>
	</body>
</html>

7.this的补充说明

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
			
			
			
			

			//创建一个name变量
			var name = "全局";
			
			//创建一个fun()函数
			function fun(){
				//console.log(name);
				//console.log(obj.name);一个一个输入太麻烦
				//console.log(obj2.name);一个一个输入太麻烦
				console.log(this.name);//自动适配:孙
			}
			//创建两个对象
			var obj = {
				name:"孙悟空",
				sayName:fun
			};
			var obj2 = {
				name:"猪八戒",
				sayName:fun
			};
			
			//fun();显示  全局
			//我们希望调用obj.sayName()时可以输出obj的名字
			obj.sayName();//显示   全局   because sayName就是fun函数,这里调用的是fun函数,所以函数里面没有name值,就直接往上找
			
			
			
			
		</script>
	</head>
	<body>
	</body>
</html>

8.使用方法创建工厂

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
			/*
			 创建一个对象
			 * 
			 *
			 */
			
		//写固定的普通对象obj
		/*	var obj = {
				name:"孙悟空",
				age:18,
				gender:"男",
				sayName:function(){
					alert(this.name);
				}
			};*/
			
			
		//更加灵活:工厂实例化
			/*
			 使用工厂方法创建对象
			 * 通过该方法可以大批量的创建对象
			 * 
			 */
			function createPerson(name , age , gender){
				//创建一个新的对象
				var obj = new Object();
				//向对象当中添加属性
				/*obj.name = "孙悟空";
				obj.age = 18;          写固定了
				obj.gender = "男";*/
				//利用参数传递值
				obj.name = name;
				obj.age = age;         
				obj.gender = gender;
				obj.sayName = function(){
					alert(this.name);
				}
				/*obj 代表的是一个对象
				 * 所谓对象就是所他可以包纳万物
				 * 无论是Number bool 还是String
				 * 或这是其他实列都包含在里面
				 * 然而Return就是需要将处理过后的结果返回出去
				 * 就相当于一个工厂
				 * 我提供原材料然而工厂输出的将会是产品
				 * 
				 */
				//将新的对象返回到函数中,让函数自己输出
				return obj;
			}
		//obj1和obj2和obj3就是工厂实例化的对象
			var obj1 = createPerson("孙悟空",18,"男");
			var obj2 = createPerson("猪八戒",28,"男");
			var obj3 = createPerson("沙悟净",28,"男");
			/*console.log(obj1);
			console.log(obj2);
			console.log(obj3);*/
			obj1.sayName();//显示  孙悟空
			
			
				
			
		</script>
	</head>
	<body>
	</body>
</html>

9.test使用工厂方法创建对象练习

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
			/*
			 使用工厂方法创建对象练习
			 * 
			 * 
			 */
			
			/*function createPerson(name , age , gender){
				//创建一个对象使用
				var obj = new Object();
				//创建对象属性:通过参数传递
				obj.name = name;
				obj.age = age;
				obj.gender = gender;
				obj.sayName = function(){
					console.log(this.name);//为什么一次只能写一次
					//console.log(this.name,this.age);
				}
				//返回一个新的对象,因为函数需要有一个值能够返回其结果并告诉函数
				return obj;
			};
			
			var obj1 = createPerson("周启永",20,"男");
			obj1.sayName();*/
		
		//使用工厂方法
			function bulider(name , age , gender){
				var obj = new Object();
				//设置属性:单个值,单个函数
				obj.name = name;
				obj.age = age;
				obj.gender = gender;
				obj.sayName = function(){
					alert(this.name);
					alert(this.age);
					alert(this.gender);
				}
				return obj;
			}
			var obj1 = bulider("周启永",18,"男");
			obj1.sayName();
			
			
			
		</script>
	</head>
	<body>
	</body>
</html>

总结

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值