人间烟火气,最抚凡人心
基础
- 作用:将相同的功能包装,通过调用,减少重复的代码量,提高工作效率
- 定义
- 通过function关键字:
function 函数名称() {逻辑代码}
- 注意:函数名称不要用name
- 通过字面量的方式:
var 函数名称 = function() {逻辑代码}
- 通过function关键字:
- 使用
- 定义完函数后,函数中的代码不执行
- 如果要执行函数中的代码,必须要调用函数才可以
- 调用函数的语法:
函数名称()
- 注意:在调用函数的时候,小括号不可以省略
- 参数
- 作用:为了更灵活的解决问题
- 形参:在定义函数时候写的参数
function fn(a, b) {}
:a和b就是函数fn的形参- 形参的本质就是一个变量
- 实参:在调用函数时候写的值
function fn(a, b) {} fn(2, 3)
:2和3就是函数fn的实参- 没有给实参赋值,就会出现undefined
- 实参和形参的关系
- 实参和形参的个数是一一对应的
- 实参的个数和形参的个数要相同
- 在赋值的时候,第一个实参的值会赋值给第一个形参,后面依次类推
- 实参和形参的个数是一一对应的
- 总结
- 参数就是一个变量,参数叫什么都可以
- 参数的个数可以根据具体的需求,自己确定
- 参数的值的来源:来源于函数的调用
- 如果函数有参数,那么在调用的时候就要设置对应的参数
- 返回值
- 作用:为了在函数外部得到函数内部变量的值
- 通过返回值得到内部变量的值
function fn() { var a = 1 // 将变量a作为返回值,返回给函数外部 return a } // 获取返回值 var 变量 = fn()
- 注意事项
- 如果没有设置返回值,那么该函数也是有返回值的,默认值是undefined
- 返回值只能设置一个return,当执行return关键字后,后面的代码不再执行
- 如果希望多个结果返回,那么可以使用数组作为返回值
扩展
- arguments
- 作用:当函数中形参个数无法确定的时候,可以通过arguments获取函数传递过来的实参
- 总结
- 当函数中形参的个数无法确定的时候,依然要获取实参的值
- arguments只能在函数中使用
- arguments就是一个数组[用来保存实参信息的数组]
- 要得到实参的个数,通过
arguments.length
- 要通过实参的具体值,通过遍历arguments数组
- 如果函数的形参个数能够确定,那么还是推荐使用形参来获取实参的值
function obtainSum() { var sum = 0 for (var i = 0; i < arguments.length; i++) { console.log(arguments.length) // 5 console.log(arguments) // 1, 3, 5, 6, 3 sum += arguments[i] } console.log(sum) // 18 } obtainSum(1, 3, 5, 6, 3)
匿名函数、自调用函数 (了解)
- 匿名函数:没有函数的名字
- 自调用函数:自己调用自己
(function() {})()
函数作用域及作用域链 (了解)
- 作用域
- 全局作用域:函数外部的其它区域称为全局作用域,在全局作用域中定义的变量称为全局变量
- 局部作用域:函数内部的区域称为局部作用域,在局部作用域中定义的变量称为局部变量
- 全局变量和局部变量的区别
- 全局变量可以在任何作用域中直接使用
- 局部变量只能在当前的作用域中被使用
- 如果要使用局部变量,那么只能通过返回值才能使用
- 注意
- 在函数内部定义的变量叫局部变量
- 如果要在函数内部定义全局变量,那么在定义变量的时候不加var关键字就可以了
- 作用域链
- 作用域和作用域链接到一块,形成的一个链状结构 ----> 作用域链一级一级往上找,形成一个链状结构,就形成作用域链
- 作用:当程序在执行代码的时候,先在当前作用域中执行代码,如果当前作用域没有,那么程序会沿着作用域链向上一级查找执行代码
代码预解析 (了解)
- 变量提升:当程序中遇到变量的时候,那么会将变量的声明提升到当前作用域的开始位置,不包括变量的赋值
- 函数提升:当程序中遇到函数的时候,那么会将函数的声明提升到当前作用域的开始位置,不包括函数的调用
- 总结:如果变量和函数相同,那么就先提升函数
练习题
- 练习1:求 n - m 之间的数字之和 [求任意两个数字的和]
function getSum(n, m) { var sum = 0 for (var i = n; i <= m;i++) { sum +=i } console.log(sum) } getSum(1, 2)
- 练习2:求3个数中的最大值
function getMax(ary) { var max = ary[0] for (var i = 0; i < ary.length; i++) { if (ary[i] > max) { max = ary[i] } } console.log(max) } getMax([1, 4, 8])
- 练习3:将一个数组中所有偶数添加到一个新数组中返回,并计算新数组总和
function getNewAry(ary) { var newArray = [] for (var i = 0; i < ary.length; i++) { if (ary[i] % 2 === 0) { newArray[newArray.length] = ary[i] } } return newArray } var ary = getNewAry([1, 2, 3, 4]) var sum = 0 for (var i = 0; i < ary.length;i++) { sum += ary[i] } console.log(sum)
- 练习4:写一个函数,判断是否是闰年【能被4整除且不能被100整除,或者能被400整除】
function getYear(year) { if (year % 400 === 0 && year % 100 !==0 || year % 400 === 0) { return true } else { return false } } console.log(getYear(2024))
- 练习5:写一个函数,实现对数字数组的排序
function getSort(ary) { for (var i = 0; i < ary.length - 1; i++) { for (var k = 0; k < ary.length; k++) { if (ary[k] < ary[k + 1]) { var c = ary[k] ary[k] = ary[k + 1] ary[k + 1] = c } } } return ary } console.log(getSort([3, 1, 4, 5]))
- 练习6:判断哪一个数字是基数还是偶数
function shu() { var num = prompt('请输入一个数字') if (num % 2 === 0) { alert('该数字是一个偶数') } else { alert('该数字是一个奇数') } } shu()
- 练习7:在1~100内不通过js循环(map, for, foreach)的语法,创建一个[3,6,9…]的一个数组
var arr = [] function fn(n) { if (n === 0) { return } if (n % 3 === 0) { arr.push(n) } fn(n - 1) } fn(100) var newArray = arr.reverse() console.log(newArray)