JavaScript函数

目录

函数

定义函数的两种方式

函数自调用

函数的数据类型

回调函数

作用域&块级作用域

局部变量VS全局变量

隐式全局变量VS全局变量

作用域链 

预解析


函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。

函数分两种

命名函数(函数声明):如果函数有名字,就是命名函数

匿名函数(函数表达式):如果函数没有名字,就是匿名函数

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script>
			//命名函数(函数声明)
			function f1(){
				console.log('我是命名函数');
			}
			
			//命名函数调用
			f1();
			
			//匿名函数(函数表达式)
			var f2 =function (){
				console.log('我是匿名函数');
			}
			
			//匿名函数调用
			f2();
			
		</script>
	</body>
</html>

定义函数的两种方式

函数声明

function 函数名 () {  //函数体  }

函数表达式

var 变量 = 匿名函数 ;

把一个函数给一个变量,此时形成了函数表达式

函数声明和函数表达式二者区别:

在页面中有两个同名的命名函数,后面的一个命名函数会覆盖前面的命名函数

在页面中有两个同名的匿名函数,后面的匿名函数不会覆盖前面的匿名函数

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script>
			function f1() {
				console.log("哈哈哈");
			}
			f1();

			function f1() {
				console.log("你好");
			}
			f1();

			//如果在页面中有两个同名的命名函数,后面的一个命名函数会覆盖前面的命名函数

			var f2 = function() {
				console.log("函数表达式");
			};
			f2();
			var f2 = function() {
				console.log("函数声明");
			};
			f2();
			//如果在页面中有两个同名的匿名函数,后面的匿名函数不会覆盖前面的匿名函数
		</script>
	</body>
</html>

函数自调用

声明函数的同时进行调用

语法:

function 函数名() {
	//函数体
}
函数名();
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script>
			//先声明函数
			function f1(){
				console.log("先声明函数,再调用");
			}
			
			f1();
			
			//声明函数的同时进行调用
			(function f2(){
				console.log('声明函数的同时调用函数');
			})();
			
			
		</script>
	</body>
</html>

函数的数据类型

函数是有数据类型,它的数据类型是:function

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script>
			function f1(){
				console.log('qwert');
			}
			
			//输出函数的数据类型
			console.log(typeof f1);//function
			
			var f2 = function (){
				console.log('asdfg');
			}
			
			console.log(typeof f2);//function
			
		</script>
	</body>
</html>

 任何数据类型都可以作为参数,函数也可以叫做回调函数

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script>
			function f1(x,y) {
				console.log(x+y);
			}
			f1(10,20);
			f1('hello','java');
			f1('123',123);

			function f3(x) {
				console.log(x);
			}
			f3(true);
			

		</script>
	</body>
</html>

 任何数据类型都可以作为返回值,函数也可以

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script>
			function f1() {
				console.log("f1函数调用了");
				return function() {
					console.log("我是f1函数里return返回的结果");
				};
			}
			
			//ff是一个匿名函数
			var ff=f1();
			
			ff();
		</script>
	</body>
</html>

回调函数

函数A作为参数传递到另一个函数B中,并且这个函数B执行函数A。就说函数A叫做回调函数

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script>

			
			//回调函数:在一个函数中去调用另外一个函数,调用的这个函数是由参数传递过来的
			function f1(fn){
				console.log('我是f1函数里的输出语句');
				fn();	
			}
			function f2(){
				console.log("我是回调函数哦~");
			}
			f1(f2);


			
			
		</script>
	</body>
</html>

作用域&块级作用域

作用域:作用域就是在这一个区域内有作用(使用范围)

块级作用域:一对大括号就可以看成是一块

JS中没有块级作用域,但是函数除外

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script>
			{
				var num = 100;
				console.log(num);
			}
			
			console.log(num);
			
			if(true){
				var num2 =200;
				console.log(num2);
			}
			
			console.log(num2);
			
			for(var i = 1;i<=5;i++){
				var num3 = 300;
				console.log(num3);
			}
			
			console.log(num3);
			
			function f1(){
				var num4 = 400;
				console.log(num4);
			}
			
			f1();
			
			//JS没有作用域的概念,但是,函数中定义的变量只能在函数中使用
			// console.log(num4);
			
			function f2(){
				//没有使用var声明的变量自动升级为全局变量,在函数外也可以使用
				num5 =500;
				console.log(num5);
			}
			f2();
			console.log(num5);
			
		</script>
	</body>
</html>

 

局部变量VS全局变量

全局变量:在函数外声明的变量,网页上的所有脚本和函数都能访问它

局部变量:在函数内部声明的变量(使用var),只能在函数内部访问它

        可以在不同的函数中使用名称相同的局部变量

生存期:

局部变量在函数运行以后被删除

全局变量在页面关闭后被删除

全局变量和局部变量区别:作用域不同、声明位置不同、生存期不同

隐式全局变量VS全局变量

隐式全局变量:声明变量时没有使用声明变量的关键字

隐式全局变量是可以被删除的,但是全局变量是不能被删除的

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script>
			var a1=1;  //全局变量
			a2=2;        //隐式全局变量
			delete a1;
			delete a2;
			console.log(a1);
			// console.log(a2);
			
			//隐式全局变量是可以被删除的,但是全局变量是不能被删除的

			console.log(typeof a1);//number
			console.log(typeof a2);//undefined

			
			
		</script>
	</body>
</html>

作用域链 

沿着作用域链一级一级地搜索过程。搜索过程始终从作用域链端开始,然后逐级向回溯,直到找到为止(如果找不到,通常会报错)

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script>
			var num = 10;

			function f1() {
				// var num = 20;

				function f2() {
					// var num = 30;

					function f3() {
						// var num = 50;
						console.log(num);
					}
					f3();
				}
				f2();
			}
			f1();
		</script>
	</body>
</html>

预解析

预解析就是预先解析function和var

变量的声明提前了----提前到当前所在的作用域的最上面

函数的声明也会被提前---提前到当前所在的作用域的最上面

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script>
			//先声明变量再使用
			var num =10;
			console.log(num);
			
			console.log(number);//underfined
			var number = 100;
			
			/*
			console.log(number);
			var number = 100;
			等价于:
			var number;
			console.log(number);
			number = 100;
			*/
			
			f1();
			function f1() {
				console.log(num);         
				var num=10;
			}       

			
		</script>
	</body>
</html>

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值