函数
函数可以看做是一个黑箱子,你给它丢入某个参数,它根据这个参数计算出相应的结果或者进行相应的操作。
函数可以让我们重复的使用代码,比如我要吃西红柿炒蛋,那么我会对西红柿和蛋进行一顿比较复杂的操作,然后做出一道西红柿炒蛋。然后今天我又要吃西红柿炒蛋,那么我会重复上次的工作,然后做出西红柿炒蛋。现在假如我有一台西红柿炒蛋机,我把如何做西红柿炒蛋告诉它,然后我每次要吃西红柿炒蛋时,我只需要把西红柿和蛋放进去,这台机器就会为我做出西红柿炒蛋。函数就可以看做是上面的西红柿炒蛋机。
函数的定义
函数的定义方式为
function 函数名(形参列表){
函数体
返回值(可选)
}
比如下面定义了一个将两个数相加的函数
function add(x,y){
return x + y;
}
其中x,y
为传入的参数,我们将x+y
的结果返回(输出),下面我们调用这个函数
var result = add(1,2); //result = 3
函数的案例
求1-n所有数字的和
function sum(n) {
var sum = 0;
for(var i = 1; i <= n; i++) {
sum += i;
}
return sum;
}
//求1-5所有数字的和
var result = sum(5);
console.log(result);
15
求n的阶乘
function factorial(n) {
var res = 1;
for (var i = 1; i <= n; i++){
res *= i;
}
return res;
}
var result = factorial(5);
console.log(result);
120
判断某个数是不是素数
function isPrime(num) {
//遍历到根号num即可
for(var i = 2; i <= Math.sqrt(num); i++){
if (num % i == 0){
//如果可以被整除,则返回false,不是素数
return false;
}
}
//遍历完则表明不能被整除,则返回true
return true;
}
console.log(isPrime(3));
console.log(isPrime(5));
console.log(isPrime(15));
true
true
false
求斐波那契数列第n(n>=3)个位置的值
function getFibonacci(n) {
var num = 0;
var num1 = 1;
var num2 = 1;
for (var i = 3; i <= n; i++){
num = num1 + num2;
num1 = num2;
num2 = num;
}
return num;
}
console.log(getFibonacci(12));
144
arguments数组
还是以上面相加函数为例,上面是将两个数字相加,那么现在如果我要将三个数字相加,我就要重新写一个函数
function add(x,y,z) {
return x + y + z;
}
并且上面的两个数相加的函数被覆盖了,那有没有什么方法可以做到将任意个数的数字相加呢?用户传入两个数字就将两个数字相加,传入三个数字就将三个数字相加。
我们可以使用arguments
数组,这个数组里的内容就是用户传入的东西。所以函数可以写为
function add() {
var sum = 0;
for (var i = 0; i < arguments.length; i++){
sum += arguments[i];
}
return sum;
}
console.log(add(1,2,3,4,5));
函数表达式
函数的另一种定义方法为
var f = function () {
函数体
};
方法的调用为
f();
这种表达的方法叫做函数表达式,其中
function () {
函数体
}
叫做匿名函数。
这种方法定义与
function f() {
}
看起来是一样的,并且调用的方法也是一样的,但是还是有稍微的不同,这个以后讲到预解析就知道了,我们一般会使用函数表达式的方式。
我们可以根据下面的方法直接调用函数
(function () {...})();
这种方式叫做函数的自调用。