JavaScript-函数

函数

  • js 默认是从上至下是顺序执行
  • 分支:可以让js代码选择(跳过)执行
  • 循环:可以让代码重复执行
  • 函数:可以重复调用代码块

函数的定义

  • 定义函数名字与变量的命名一致
  • 由数字 字母 下划线 $ 组成
  • 不能以数字开头,不能是关键字
// 最基础的函数
function 函数名() {
	函数内容;
}
// 列子:定义函数 用三种方式输出“你好”;
function say() {
	console.log("你好");
	document.write("你好<br/>");
	alert("你好");
}
// 调用函数:函数名()
say();

函数的调用

  1. 函数名()
// 基础调用 可以调用多次
函数名();
函数名();
函数名();
函数名();
  1. 事件调用
    • html 标签事件属性
// 标签事件属性
<button onclick="say()">触发</button>
- html 元素事件监听
//可以直接通过id名来访问事件,调用函数;
<button id="btn">触发</button>
btn.onclick = say; //调用 就是操作dom的属性,简写
// 同样的方法,不同写法(带参数调用)
<button id="pear">苹果</button>
var pear = document.getElementById("pear");
	pear.onclick = function() { juice("苹果") };
	//使用匿名函数传递参数

函数调用函数

// 定义加,减,乘,除,函数
	function add(a,b) {
		return a + b;
	}
	function minus(a,b) {
		return a - b;
	}
	function times(a,b) {
		return a * b;
	}
	function divide(a,b) {
		return a / b;
	}
	// 定义总函数 传入参数,分别调用以上函数
	function fun(a,b) {
		console.log("a+b:" + add(a,b));
		console.log("a-b:" + minus(a,b));
		console.log("a*b:" + times(a,b));
		console.log("a/b:" + divide(a,b));
	}
	//调用 fun
	fun(3,3);

函数的参数

  • 单个参数
parseInt("字符"); //转换为整数
parseFloat("字符"); //转换为小数
alert(变量); 	// 弹出框
// 以上的括号里的都算是参数
// 定义一个榨汁函数,juice ,给他输入水果,返回什么样的水果汁
function juice(fruit) {
	alert("一杯新鲜的" + fruit + "汁榨好了);
}
// 调用 并 传参
juice("苹果");
juice("西瓜");
juice("草莓");
// fruit 称之为:函数的形参(占一个位置,给真正要传递的参数)
// "苹果","西瓜","草莓",这些是真正的参数(去占用,形参占用的位置)
  • 多个参数,使用逗号“,”隔开
function add(a,b) {
	alert(a + b);
}
add(5 + 4);

arguments 函数参数列表

  • arguments.length 参数列表的长度
  • arguments[num] 参数列表的每一项的值,mun从0开始
// 使用arguments 求平均值
function avg() {
	console.log(arguments); //查看arguments有什么
	var total = 0;
	for(var i = 0; i <= arguments.length - 1; i++) {
		total += arguments[i]; //循环累加,i对应的值
	}
	// 求平均值,个数为arguments中的长度
	alert("平均值:" + total/arguments.length);
}
avg(5,6,2,3); // 调用,且 ,传参,参数个数随便

形参和实参

  • 形参
// fruit 称之为:函数的形参(占一个位置,给真正要传递的参数,形式上的参数)
  • 实参
// "苹果","西瓜","草莓",这些是真正的参数(去占用,形参占用的位置)
  • 当函数执行的时候,实参会占用形式上的参数

函数的返回值

  • 关键字:return
  • 当执行函数遇到return时,return之下的语句将不在执行;
  • return 语句只会返回一个值,默认为:undefined
// 普通的这样 alert(result);
function add(a,b) {
	a + b;
}
var result = add(4,6);
alert(result); // 结果为:undefined
// 定义函数 add 参数a,b 返回a,b的和
function add(a,b) {
	return a + b;
}
var result = add(4,6); //调用,传参,赋值,如果函数有返回值,则会赋值,不然是空
	alert(result);

函数,自己调用自己-----递归

  • 函数调用自己,要有终止函数条件,不然会死循环
  • 递归的规律
// 5,4,3,2,1
function outPut(n) {
	// 终止条件 ,如果n === 0时,终止,
	if(n === 0) {
		return;
	}
	console.log(n);
	outPut(n - 1); // 递归调用自己,每次参数减1
}
outPut(5); //调用,传参
// 求传入参数1-n的和 第一种
function add1(n) {
	var total = 0;
	for(var i = 1; i <= n; i++) {
		total += i;
	}
	return total;
}
alert(add1(3)); //6
// 求传入参数1-n的和 第二种,递归
function add2(n) {
	//终止条件
	if(n === 1) {
		return 1;
	}
	return n + add(n - 1);
}
alert(add2(3)) // 6
// 解析:
	add2(3)
	3	add2(3 - 1);
		2	add2(2 - 1);
			1	if(n === 1) return 1;
			===> 6
// 斐波那契数列:又称“兔子数列”:1,1,2,3,5,8.。。。
// 编写一个函数fib ,传参数n,返回,斐波那契数列 n位的值
function fib(n) {
	// 终止条件
	if(n === 0 || n === 1) {
		return 1;
	}
	return fib(n - 1) + fib(n - 2);
}
alert(fib(4));		// 调用,传参

函数的前置(函数的提升)

  • js 在编译中,会把函数提升到最前面,也会把变量提升到最前面,变量的默认值时undefined
  • 在函数定义前后调用,都可以成功访问
  • 函数赋值给变量,就不能在赋值的前面访问,只能在赋值后面访问。
msg(); //可以调用到
function msg() {
	alert("你好");
}
msg(); //报错 (msg is not function)
var msg = function() {
	alert("你好");
}

匿名函数—没有名称的函数

  • 匿名函数定义
// 不会执行
function() {
	alert("abc");
}

调用匿名函数

  • 事件监听
// html
<button id="btn"></button>
// js
btn.onclick = function() {
	alert("abc");
}
  • 自执行
// 匿名函数赋值 调用
var fun = function() {
	alert("abc");
}
fun()
// 括号包裹 调用
(function() {
	alert("abc");
})();
===> 相当于:(匿名函数)();
// 符号 调用
!function() {
	alert("abc");
}();
===> 相当于:!匿名函数();
// 同时还有:!,+,-,~,可以调用

变量的作用域

  • 变量可以使用的范围
  • 在函数中声明的变量,只能在函数中使用:局部变量
  • 在script标签中声明的变量,任何地方都可以使用:全局变量
  • if,switch,for,是没有作用域的,只有函数才有作用域
  • 函数内部,有函数,函数嵌套,内部函数可以访问外部函数,但是外部函数不能访问内部函数;
var a = 20;
console.log("外部访问a",a);	//能访问到
function out() {
	var b = 50;
	console.log("在内部访问a和b:",a,b);  //能访问到
}
out() // 调用函数
console.log("函数外部访问b:",b);		// 访问不到b
var a = 15;
function fun() {
	var a = 20;		//这里的a ,与,外部的a,是两个变量
	alert(a);		//这里访问的是内部的a
}
fun();		//20 因为调用的函数,所以执行的函数内部的语句,是20
alert(a);   //15 这里因为访问不到内部的a,所以访问的是外部的a
function funA() {
	var a = "你好啊,A";								
	function funB() {				 				
		var b = "hi B";
		function funC() {
			var c = "前端真好啊,C";
			console.log(a,b,c);  
		}
	}
}
//可以看到,a的作用范围,在他所在函数的大括号的范围中
//可以看到,b的作用范围,在他所在函数的大括号的范围中
//可以看到,c的作用范围,在他所在函数的大括号的范围中

自由变量

  • 没有在当前作用域定义的变量称为:自由变量
function fun() {
	alert(b);
}
// 访问b这个变量时,b变量没有在当前作用域定义,b是自由变量
// 自由变量会从内至外,向上,依次查找,直到全局,如果找不到b,就进行报错:b is not defined;
// 如果在某一个作用域下,找到了,则,访问找到的变量,从内至外
var a = 50;
function funA() {
	var a = 30;
	function funB() {
		alert(a);  // a 自由变量,向上查找,找到了30,就不再找,如果没找到继续找
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值