函数基本使用
1) 什么是函数
2) 函数的定义和调用
函数的定义

函数表达式
函数的调用

//定义函数,定义的函数是不会直接执行的 function fun() { console.log('你好'); console.log('我是'); } function fu() { console.log('你好'); } //函数必须要等到调用的时候才能被执行 fun(); fu();
语句执行顺序

函数声明的提升
函数表达式不能提升
函数优先提升
3) 函数的参数和返回值
函数的参数
形实结合
形参和实参个数不同的情况

案例

//定义一个函数,这个函数的功能就是计算a到b之间所有整数的和 function calcSumFromAtoB(a,b){ for(var i=a,sum=0;i<=b;i++){ sum+=i; } console.log('从'+a+'到'+b+'的所有整数和是'+sum); } calcSumFromAtoB(3,7);
arguments

function fun(){ console.log(arguments); } fun(1,23,4,45,35,2);
//不管用户传入多少个实际参数,永远能够计算它们的和 function fun() { for (var i = 0, sum = 0; i < arguments.length; i++) { sum += arguments[i]; } console.log('所有参数的和是' + sum); } fun(1, 23, 4, 45, 35, 2);
函数的返回值

//函数的功能是返回两个参数的和 function sum(a,b){ return a+b; } var result=sum(3,4); console.log(result);
遇见return即退出函数


//书写一个函数,函数的功能判断一个数字是否是偶数 function checkEven(n) { if (n % 2 == 0)return true; return false; } var result = checkEven(7); console.log(result);
函数像一个“小工厂”
函数算法题
1) 函数算法题1

//计算一个数字的阶乘 function factorial(n) { //累乘器 var result = 1; for (var i = 1; i <= n; i++) { result *= i; } return result; } //穷举法,从100到999寻找喇叭花数 for (var i = 100; i < 1000; i++) { //把数字i变为字符串 var i_str = i.toString(); //a、b、c分别表示百位、十位、个位 var a = Number(i_str[0]); var b = Number(i_str[1]); var c = Number(i_str[2]); //根据喇叭花数的条件,来判断 if (factorial(a) + factorial(b) + factorial(c) ==i) { console.log(i); } }
2) 函数算法题2


var arr = [11, 24, 5, 4, 65]; //排序 arr.sort(function (a, b){ if (a > b) { return 1; } else { return -1; } }); console.log(arr)
递归
1) 什么是递归
递归
用求4的阶乘举例
递归的要素

//书写一个函数,这个函数内部自己会调用自己,从而形成递归。 function factorial(n) { //函数的功能是计算n的阶乘,n!不就是n*(n-1)!么? //这个就是递归的出口,如果计算1的阶乘,可以不用递归了直接告诉答案就是1 if (n == 1) return 1; //如果询问的不是1的阶乘,就返回n*(n-1) return n * factorial(n - 1); } var result = factorial(4); console.log(result);
2) 递归常见算法题

//编写一个函数,这个函数的功能是返回斐波那契数列中下标为n的那项的值 function fib(n) { //数列的下标为0和下标为1的项值是1 if (n == 0 || n == 1) return 1; //斐波那契数列的本质特征就是每一项,都等于前面两项的和 return fib(n - 1) + fib(n - 2); } //书写一个循环语句,计算斐波那契数列的前十五项 for(var i=0;i<15;i++){ console.log(fib(i)); }
3) 实现深克隆
复习引用类型值的相关知识
复习浅克隆
实现深克隆

//原数组 var arr1 = [1, 23, 3, [1, 2]] //函数,这个函数会被递归 function deepClone(arr) { //结果数组 var result = []; //遍历数组的每一项 for (var i = 0; i < arr.length; i++) { //类型判断,如果遍历到的项是数组 if (Array.isArray(arr[i])) { //递归 result.push(deepClone(arr[i])); } else { //如果遍历到的项不是数组,是基本类型值,就直接推入到结果数组中 //相当于是递归的出口 result.push(arr[i]); } } //返回结果数组 return result; } //测试一下 var arr2=deepClone(arr1); console.log(arr2);
作用域和闭包
1) 全局变量和局部变量
变量作用域
全局变量
遮蔽效应
注意考虑变量声明提升的情况
形参也是局部变量
作用域链

不加var将定义全局变量
2) 闭包
从一个题目开始

//创建一个函数 function fun() { //定义局部变量 var name = '慕课网'; //返回一个函数 return function () { alert(name); } } //调用外部函数,就能得到内部函数 var inn = fun(); //执行inn函数,就相当于在fun函数的外部,执行了内部函数 inn();
什么是闭包


观察闭包现象
闭包非常实用
闭包用途 记忆性
闭包的记忆性举例

function createCheckTemp(standardTemp){ function CheckTemp(n){ if (n<=standardTemp){ alert('你的体温正常') }else { alert('你的体温偏高') } } return CheckTemp; } //创建一个CheckTemp函数,它以37.1度为标准线 var CheckTemp_A=createCheckTemp(37.1); //创建一个CheckTemp函数,它以37.3度为标准线 var CheckTemp_B=createCheckTemp(37.3); CheckTemp_B(37.2);
闭包用途 模拟私有变量

//封装一个函数,这个函数的功能就是私有化变量 function fun(){ //定义一个局部变量 var a=0; return { getA:function(){ return a; }, add:function(){ a++; }, pow:function(){ a*=2; } }; } var obj=fun(); //如果想在fun函数外面使用变量a,唯一的方法就是调用getA()方法 console.log(obj.getA()); //想让变量a进行加1操作 obj.add(); obj.add(); obj.add(); console.log(obj.getA());
使用闭包的注意点
