1. 函数
1.1 函数基础简介
- 函数介绍
| 函数:具有特定功能的代码块 |
| 本质:一种对象数据类型 |
| 功能:1. 代码复用 2. 项目模块化 |
| 函数组成(两者必须同时存在): |
| 1. 函数定义 |
| 2. 函数调用 |
| 有声明,没调用,函数不会生效; |
| 没声明,有调用。引用类型错误 |
-
函数的定义方式(三种,本质上都是 new Function()
)
| function fun1() { |
| console.log(11); |
| } |
| console.log(fun1); |
| |
| |
| ƒ fun1() { |
| console.log(11); |
| } |
| var fun2 = function () { |
| console.log(22); |
| } |
| console.log(fun2); |
| |
| |
| ƒ () { |
| console.log(22); |
| } |
| 函数声明和表达式定义的区别? |
| 1. 函数声明定义的函数在控制台会带名字 |
| 2. 函数表达式定义的函数在控制台不带名字 |
| var fun3 = new Function( |
| 'console.log("33");' |
| ); |
| console.log(fun3); |
| |
| |
| ƒ anonymous( |
| ) { |
| console.log("33"); |
| } |
1.2 函数的三要素
- 函数声明三要素
| function fun1(a, b) { |
| console.log(a, b); |
| return 0; |
| } |
| |
| 功能:看函数名字(函数体是真实逻辑) |
| 参数:形参(形式参数) |
| 形参本质:函数内部定义的变量,可以接收外部传递的实参 |
| 返回值:1. return后面的值 |
| 只写了return;或者没有return,返回值都是undefined |
| 2. return后面的代码不会执行 |
- 函数调用三要素
| fun1(1, 2); |
| |
| 功能:函数调用的名称必须和函数声明的名字一致 |
| 参数:实参(实际参数) |
| 实参本质:给函数声明的形参赋值 |
| 返回值:函数调用本质是一个表达式,返回值看return的值 |
- 函数调用的特殊情况
| 1. 实参多于形参,可以调用成功,多的实参不会被赋值 |
| fun1(1, 2, 3); |
| |
| 2. 实参少于形参,可以调用成功,少的实参会自动赋值undefined |
| fun1(1); |
1.3 函数三要素案例
| |
| function fn1(a) { |
| console.log(a); |
| } |
| console.log(fn1); |
| console.log(fn1(12)); |
| |
| |
| |
| function fn2(a, b, c) { |
| console.log(a); |
| console.log(c); |
| return; |
| } |
| console.log(fn2(1, 2)); |
| |
| |
| function fn3(a, b, c) { |
| console.log(a); |
| return 45; |
| console.log(b); |
| console.log(c); |
| } |
| fn3(12, 23, 34); |
| |
| |
| function fn4(a, b, c) { |
| console.log(a); |
| return b; |
| } |
| console.log(fn4(12)); |
| |
| |
| function fn5(b, c) { |
| console.log(b); |
| console.log(c); |
| return 56; |
| } |
| console.log(12); |
| console.log(fn5(23, 34)); |
| console.log(45); |
1.4 函数的基础案例
| 1.未知使用参数 |
| 2.返回值使用return |
| |
| |
| |
| function printLove() { |
| for (var i = 0; i < 100; i++) { |
| console.log("我爱你"); |
| } |
| } |
| printLove(); |
| |
| |
| |
| function printContentN(n, content) { |
| for (var i = 0; i < n; i++) { |
| console.log(content); |
| } |
| } |
| printContentN(52, 'i love you'); |
| |
| |
| |
| |
| function sum() { |
| return 2 + 3; |
| } |
| console.log(sum()); |
| |
| |
| |
| function sumNM(n, m) { |
| return n + m; |
| } |
| console.log(sumNM(100, 200)); |
1.5 函数的强化案例
| |
| function sum(n) { |
| var sum = 0; |
| for (var i = 1; i <= n; i++) { |
| sum += i; |
| } |
| return sum; |
| } |
| console.log(sum(100)); |
| |
| |
| function factorial(n) { |
| var total = 1; |
| for (var i = 1; i <= n; i++) { |
| total *= i; |
| } |
| return total; |
| } |
| console.log(factorial(4)); |
| |
| |
| |
| function maxAndMin(arr) { |
| var max = arr[0]; |
| var min = arr[0]; |
| for (var index = 1; index < arr.length; index++) { |
| if (arr[index] > max) { |
| max = arr[index]; |
| } |
| |
| if (arr[index] < min) { |
| min = arr[index]; |
| } |
| } |
| |
| return [max, min]; |
| } |
| console.log('最大值:' + maxAndMin([1, 4, 5, 7, 11, 3, 2])[0]); |
| console.log('最小值:' + maxAndMin([1, 4, 5, 7, 11, 3, 2])[1]); |
| |
| |
| function addNum(arr) { |
| for (var index = 1; index < arr.length; index++) { |
| console.log(arr[index] + 10); |
| } |
| } |
| addNum([1, 2, 3, 4, 5]); |
| |
| |
| |
| function findPrimeNumber(n) { |
| var flag = true; |
| for (var i = 1; i <= n; i++) { |
| for (var j = 2; j < i; j++) { |
| if (i % j == 0) { |
| flag = false; |
| break; |
| } |
| } |
| if (flag & i != 1) { |
| console.log(i); |
| } |
| flag = true; |
| } |
| } |
| findPrimeNumber(10); |
| |
| |
| |
| function sort(arr) { |
| var temp = 0; |
| |
| for (var i = 0; i < arr.length - 1; i++) { |
| |
| for (var j = 0; j < arr.length - 1 - i; j++) { |
| if (arr[j] > arr[j + 1]) { |
| |
| temp = arr[j]; |
| arr[j] = arr[j + 1]; |
| arr[j + 1] = temp; |
| } |
| } |
| } |
| return arr; |
| } |
| console.log(sort([5, 3, 11, 45, 1, 22, 0, -11])); |
| |
| |
| |
| function arrOverturn(arr) { |
| var temp = 0; |
| |
| for (var i = 0; i < arr.length / 2; i++) { |
| temp = arr[i]; |
| arr[i] = arr[arr.length - 1 - i]; |
| arr[arr.length - 1 - i] = temp; |
| } |
| return arr; |
| } |
| console.log(arrOverturn([1, 3, 5, 7, 9, 100])); |
| |
| |
| |
| function removeRepeat(arr) { |
| |
| var newArr = []; |
| var flag = true; |
| for (var i = 0; i < arr.length; i++) { |
| for (var j = 0; j < newArr.length; j++) { |
| if (arr[i] == newArr[j]) { |
| flag = false; |
| break; |
| } |
| } |
| if (flag) { |
| newArr[newArr.length] = arr[i]; |
| } |
| flag = true; |
| } |
| return newArr; |
| } |
| console.log(removeRepeat([1, 3, 4, 5, 6, 1, 2, 3, 4, 5, 11, -11, 0, 5])); |
1.6 函数的分类
| 第一种区分方式 |
| 1、js自带 console.log() parseInt() Number() |
| 2、用户自定义 sum() fun() |
| |
| 第二种区分方式 |
| 1、无参无返回值 |
| 2、有参无返回值 |
| 3、无参有返回值 |
| 4、有参有返回值 |
| |
| 第三种区分方式 |
| 1、普通函数 xxx() xxx.yyyy() |
| 2、构造函数 new xxx() |
1.7 函数的作用域
| 作用域:变量的作用范围 |
| 作用:隔离变量 |
| ES5范围分类(函数声明为界): |
| 全局作用域(在函数声明外部) |
| 局部作用域(函数声明内部) |
| |
| ☆☆☆一个变量的作用域只与函数声明的位置有关,与函数调用的位置无关! |
| |
| |
| |
| var a = 1; |
| function fn(c) { |
| var a = 2; |
| console.log(a); |
| } |
| fn(); |
| console.log(a); |
1.8 全局变量与局部变量
| 全局变量:在全局作用域中的变量 |
| 局部变量:在局部作用域中的变量 |
| |
| var a = 1; |
| function fun1() { |
| var a = 2; |
| console.log(a, '局部'); |
| } |
| fun1(); |
| console.log(a, '全局'); |
| |
| |
| var a = 1; |
| function fun1() { |
| console.log(a, '局部'); |
| } |
| fun1(); |
| console.log(a, '全局'); |
| |
| |
| function fun1() { |
| var a = 2; |
| console.log(a, '局部'); |
| } |
| fun1(); |
| console.log(a, '全局'); |
| 总结: |
| 1.全局变量和局部变量都存在,各自使用 |
| 2.全局变量存在,局部变量不存在,局部可以使用全局变量 |
| 3.全局变量存在,局部变量不存在,全局无法使用局部变量 |
| for循环定义的变量也是全局变量 |
| for (var i = 0; i < 5; i++) { |
| console.log(i); |
| } |
| console.log(i); |
1.9 局部变量不带var的分析
| |
| var a = 10; |
| var b = 20; |
| var c = 30; |
| var d = 40; |
| function fn() { |
| var a = 100; |
| var b = 200; |
| var c = 300; |
| var d = 400; |
| |
| e = 500; |
| console.log('局部', a, b, c, d); |
| console.log('局部', e); |
| } |
| fn(); |
| console.log('全局', a, b, c, d); |
| console.log('全局', e); |
| 局部变量不带var的变量,操作过程: |
| 1.先看函数内部是否声明了这个变量,如果有,这个变量是局部变量 |
| 2.如果函数内部没有声明过这个变量,看形参是否有该变量,如果有,该变量就是局部变量 |
| 3.如果函数未声明,形参也没有,那么看全局中是否有该变量,如果有,就是在操作全局变量 |
| 4.如果全局也没有这个变量,那么会在全局中声明一个变量 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统