函数篇
引入函数这个概念
问题:还记得累加和怎么写吗?
var sum = 0;
for (var i = 1; i <= 50; i++) {
sum = sum + i;
}
console.log(sum);
思考:那要算10-50累加和呢?1-1000呢?是不是要重新写一遍代码?
分析:为了使程序简洁,我们使用函数,也就是封装了一段可以重复执行调用的代码块
//定义累加和函数
function getSum(num1, num2) {
var sum = 0;
for (var i = num1; i <= num2; i++) {
sum += i;
}
console.log(sum);
}
//调用累加和函数
getSum(1, 100);//5050
getSum(1, 50);//1275
getSum(1, 1000);//500500
过程分析:
function 函数名(形参1,形参2...){
//函数体
}
函数名(实参1,实参2...)
//执行过程:调用函数getSum(1, 100);的时候,将1,100分别传给num1,num2
了解实参和形参
参数 | 说明 |
形参 | 形式上的参数,函数定义的时候传递的参数,当前并不知道是什么 |
实参 | 实际上的参数,函数调用的时候传递的参数,实参是传递给形参的 |
作用:在函数内部某些值尚不能被固定时,可用参数在调用函数的时候将不同值传进去
注意:
(1)多个参数用逗号隔开
(2)形参可看作是不用声明的变量
(3)形参实参匹配问题
//形参实参匹配问题
function getSum(num1, num2) {
console.log(num1 + num2);
}
//如果实参形参个数一致,则正常输出
getSum(1, 2); //3
//如果实参多于形参个数,则会取到形参的个数
getSum(1, 2, 3); //3
//如果实参少于形参个数,多余的形参被定义为undefined,最终输出NaN
//上文提到:形参可看作是不用声明的变量,此时num2是一个变量但还未被赋值,结果就是undefined
getSum(1); //NaN
//建议:尽量参数个数相匹配
函数的返回值
//1,return 终止函数
function getSum(num1, num2) {
return num1 + num2; //后面代码不会执行
alert("我是不会被执行的!")
}
console.log(getSum(1, 2)); //3
//2,return 只能返回一个值
function fn(num1, num2) {
return num1, num2; //返回的结果是最后一个值
}
console.log(fn(1, 2)); //2
//3.求任意两数加减乘除
function getResult(num1, num2) {
return [num1 + num2, num1 - num2, num1 * num2, num1 / num2];
}
var re = getResult(1, 2); //返回一个数组,后面会提到为什么要用变量
console.log(re); //Array(4) [ 3, -1, 2, 0.5 ]
//4,函数如果有return,则返回return后面的值;如果无则返回undefined
function fn1() {
return 666;
}
console.log(fn1()); //666
function fn2() {
}
console.log(fn2()); //undefined
注:
break,continue,return的区别
break:结束当前循环体
continue:跳出本次循环,继续执行以下循环
return:不仅可退出循环,还能够返回return语句中的值,同时还可以结束当前函数体内的代码
案例:用函数求两数最大值
//用函数求两数最大值
function getMax(num1, num2) {
return num1 > num2 ? num1 : num2;
}
console.log(getMax(1, 2));
console.log(getMax(11000, 100));
案例:用函数求数组最大值
//案例:用函数求数组最大值
function getArrMax(arr) {
var max = arr[0];
for (var i = 1; i <= arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
var re = getArrMax([3, 5, 19, 18, 24, 35, 66, 99]);
console.log(re);//99
作业1:写一个函数,用户输入任意两个数字的任意算术运算,并弹出计算的结果;
//作业1:写一个函数,用户输入任意两个数字的任意算术运算,并弹出计算的结果;
function getResult() {
var result;
var num1 = prompt("请输入第一个数:");
var num2 = prompt("请输入第二个数:");
var operator = prompt("请输入你想要的运算符:")
switch (operator) {
case "+":
result = parseInt(num1) + parseInt(num2);//接受的是字符型
break;
case "-":
result = num1 - num2;
break;
case "*":
result = num1 * num2;
break;
case "/":
result = num1 / num2;
break;
default:
break;
}
alert("计算结果是:" + num1 + operator + num2 + "=" + result);
}
getResult();//不要忘了调用函数
作业2:写一个函数,用户输入任意两个数字的最大值,并能弹出运算后的结果;
//作业2:写一个函数,用户输入任意两个数字的最大值,并能弹出运算后的结果;
function getMax() {
var max;
var num1 = parseInt(prompt("请输入第一个数:"));
var num2 = parseInt(prompt("请输入第二个数:"));
if (num1 > num2) {
max = num1;
} else {
max = num2;
}
alert("最大值:" + max);
}
getMax();
function getMax() {
var num1 = parseInt(prompt("请输入第一个数:"));
var num2 = parseInt(prompt("请输入第二个数:"));
var max = num1 > num2 ? num1 : num2;//max一定要放num后面定义,不然就是undefined
alert("最大值:" + max);//前面不要return,不然后面的句子输出不了
}
getMax();
作业3:写一个函数,用户输入任意3个不同数字的最大值,并能弹出运算后的结果;
//写一个函数,用户输入任意3个不同数字的最大值,并能弹出运算后的结果;
function getMax() {
var max;
var a = parseInt(prompt("请输入第一个数:"));
var b = parseInt(prompt("请输入第二个数:"));
var c = parseInt(prompt("请输入第三个数:"));
if (a >= b && a >= c) {
max = a;
} else if (b >= a && b >= c) {
max = b;
} else {
max = c;
}
alert("最大值是:" + max);
}
getMax();
function getMax() {
var a = parseInt(prompt("请输入第一个数:"));
var b = parseInt(prompt("请输入第二个数:"));
var c = parseInt(prompt("请输入第三个数:"));
var arr = [a, b, c];
var max = arr[0];
for (var i = 1; i <= arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
alert("最大值是:" + max);
}
getMax();
作业4:写一个函数,用户输入一个数判断是否为素数,并弹出返回值。
//2~m-1没有整除数
function getPrime() {
var num = parseInt(prompt("请输入一个数字:"));
if (num == 0) {
return 0;
} else if (num == 1) {
return 0;
} else {
for (var i = 2; i < num; i++) {
if (num % i == 0) {
return 0;
}
}
}
return 1;
}
console.log(getPrime());
关于素数这一方面我也了解不深,其他优化算法方式可以去其他地方查查,以上方法太慢,后续加深理解会更新