一、函数
function sayHello () { //function是声明函数的关键字(全部小写)
// 函数体代码
}
sayHello() // 调用函数
1、是一个独立的功能模块,可以重复使用,维护方便。 2、使用: ????????(1)声明:定义函数 ????????(2)调用: 3、声明语法:
function 函数名([参数]){
?? ??? ? ? ?函数体语句;
?? ??? ?}
????????(1)'function':是关键字,必须小写 ????????(2)'函数名':用户标识符,建议采用驼峰命名(第一个单词是动词,后面的单词首字母大写),做到'见名知义'。 ????????(3)'参数':函数可以有参数也可以没有参数。'()'不能省略的
函数的参数分为形参和实参:
形参:
在声明函数时
,在
函数名称后面的小括号中
添加
的
一些参数
实参:当函数调用的时候,需要传递相应的参数,这些参数称为实参
function 函数名(形参1, 形参2, …) { // 函数声明的小括号中的是形参
// 函数体代码
}
函数名(实参1, 实参2, …) // 函数调用的小括号中的是实参
函数的参数允许形参和实参的个数不同:
当实参数量多于形参数量时,
函数正常
执行,多余的
实参会
被忽略
当实参数量小于形参数量时,多出来的形参类似于一个已声明未赋值的变量,其值为
undefined
function getSum(num1, num2) {
console.log(num1, num2);
}
getSum(1, 2, 3); // 实参数量大于形参数量,输出结果:1 2
getSum(1); // 实参数量小于形参数量,输出结果:1 undefined
????????(4)'{}':表示函数的作用范围 注意:函数定义后并不会执行,只有当函数调用后才会执行
4、函数的调用: ????????(1)直接调用: ????????函数名(参数) ????????(2)触发事件调用: ????????事件名 = 函数名(参数) 5、Node.js: ????????(1)构建JavaScript程序的独立的运行环境 ????????(2)创建后台程序 ????????(3)环境变量:当应用程序的安装路径和用户程序的路径不同时,计算机系统可以找到应用程序的位置
6、DOS(Disk Option System) ????????(1)目录(文件夹)转换: ????????cd 文件夹名 ????????. :表示当前目录(文件夹) ???????? .. :表示当前目录的上一级目录 ???????? \ : 表示根目录(从盘符开始的目录) ????????(2)列举目录下的文件和文件夹: ???????? dir ???????? dir /p: 分屏显示文件和文件夹 ???????? dir /w: ?宽屏显示文件和文件夹
7、函数的参数:参入运算的数据 ????????(1)形参(形式参数):在函数定义时出现在函数首部的参数,只是占位符,没有实际的数据 ????????(2)实参(实在参数): 在函数调用时出现在函数首部的参数,是有确定值的变量或常量 ????????(3)参数之间的数据传递:实参将数据传递给形参(按值传递),传递的方向是单向的(实参-->形参) ?? ??? ? ? ? ? ? ? ? ? ? ? ? ? 数据传递时实参和形参按从左到右一一对应匹配与名称无关 ???????(4)参数的数量:函数的实参和形参的个数可以不同 ????????A、实参的个数多于形参的个数:函数正常运行,多余的实参被忽略 ????????B、实参的个数少于形参的个数: 多余的形参会变成undefined的变量 8、函数的返回值:函数可以有返回值,也可以没有返回值。 ????????(1)有返回值的函数:函数体中通过return语法返回一个值,这个决定程序下一步操作 ????????(2)无返回值的函数:函数只实现某种功能,不需要返回值(函数体中没有return语句)
function 函数名() {
return 要返回的值; // 利用return返回一个值给调用者
}
?练习:
//定义一个函数,实现对数组的排序(插入法)
function fun(arr){
for(i=0;i<a.length;i++){
for(var j=i;j>0;j--){
if(arr[j-1]>a[j]){
var temp =arr[j-1];
arr[j-1]=a[j]
arr[j]= temp
}
}
}
}
var a=[1,3,2,5,4];
console.log("排序前的数组是:",a);
fun(a);
console.log("排序后的数组是:",a);
??
9、arguments的使用:是JavaScript的一个内置对象(是一个数组),保存了调用函数时传递的所有实参
当不确定函数中接收到了多少个实参的时候,可以用arguments来获取实参。这是因为arguments是当前函数的一个内置对象,所有函数都内置了一个arguments对象,该对象保存了函数调用时传递的所有的实参。
function fn() {
console.log(arguments); // 输出结果:Arguments(3)?[1, 2, 3, …]
console.log(arguments.length); // 输出结果:3
console.log(arguments[1]); // 输出结果:2
}
fn(1, 2, 3);
10、回调函数:将函数A作为参数传递给函数B,在函数B中调用函数A,函数A称为回调函数
function cal(num1, num2, fn) {
return fn(num1, num2);
}
console.log(cal(45, 55, function (a, b) {
return a + b;
}));
console.log(cal(10, 20, function (a, b) {
return a * b;
}));2
11、函数的递归调用: ????????(1)什么是递归:函数自己调用自己 ????????(2)用递归解决问题条件 ????????A、问题可以分解,分解后得到的新问题的解法与原问题的解法相同 ????????B、分解的过程要有明确的结束条件 ????????(3)递归的过程:
????????A、自上而下分解问题:5! ?? ??? ? ? ? ?5!-->5*4! ?? ??? ??? ? ? ? ? ? ?4! -->4*3! ?? ??? ??? ??? ??? ? ? ? ? ? ?3!-->3*2! ?? ??? ??? ??? ??? ??? ??? ? ? ? ? ? 2!-->2*1! ????????B、自下而上回溯得到问题的解? ?? ? ? ? ? ? ?1!-->2!-->3!-->4!-->5!
?????????练习: ?? ??? ??? ?2、输出斐波拉契数列的前20项之和 ?? ??? ??? ? ?? ??? ??? ? ? 1 ?1 ?2 ?3 ?5 ?8 ?13 ?21...
//输出斐波拉契数列的前20项之和
function fun(n){
if(n==1 || n==2){
return 1;
}else{
return fun(n-1)+fun(n-2);
}
}
var sum=0;
for(var i=1;i<=20;i++){
sum += fun(i)
}
console.log("斐波拉契数列的前20项之和为:",sum)
|