1.函数的定义:
被封装好可重复执行的一段代码块
是代码中的工具-使用方便,可以重复利用,具备一定的功能
优点:
1.封装(打包多条语句)
2.重用(反复使用,优化代码)
3.可扩展(可变的设为参数)
2.函数的创建:
1.声明式:
function 函数名(){
代码段
}
2.赋值式:就是将一个函数赋值给一个变量
var 变量名 = function(){
代码段
}
创建完调用使用:
声明式——函数名();
赋值式——变量名();
3.函数的参数:
function add(a,b){ //小括号就是函数这个工具的入口 - 形参(形式上的参数)
var c = a + b;
console.log(c);
}
add(3,4); // 实参(实际上的参数)
实参跟形参是数量相同的,一一对应的
原则上讲,函数的形参和实参不光是数量要对应,还应该是类型也要对应如果只传入一个参数,a有值,b就没有值了,没有值就是undefined
如果实参的数量比形参的数量多,不会报错,多余的实参在函数中就无法使用
函数中还有一个关键字arguments可以获取到所有的实参
通过arguments得到所有实参的数量 - arguments.length
console.log(arguments.length);
通过arguments可以得到任何一个实参 - 通过序号 - arguments[序号]
console.log(arguments[序号]);
4.带返回值的函数:
语法:
function 函数名(){
return 返回的结果
}
将结果返回的关键字是return,这样可以将函数运算的结果返回给调用者带有返回值的函数,当调用函数的时候得到一个结果,这个结果可以参加运算,也可以进行赋值。
带有返回值的函数,当函数执行到return关键字的时候,函数就终止了,在return后面的代码不会运行。
return的作用:
1. 终止代码继续运行
2. 在函数中返回一个内容
eg:
// 定义一个让指定数字递增的函数
function increase(x){ // 带有参数的函数
var y = x + 1;
return y
}
// 让2递增,得到结果赋值给变量a
var a = increase(2);
document.write(a%2); // 3%2 = 1
// 让5递增,得到结果赋值给变量b
var b = increase(5);
alert(b/2); // 6/2 = 3
// 让10递增,得到结果赋值给变量c
var c = increase(10);
console.log(c+a-b); // 11+3-6 = 8
5.匿名函数:
1.概念:
顾名思义,匿名函数就是没有名字的函数
2.定义:
语法:
function(){
代码段
}
匿名函数也可以传递参数
3.调用:匿名函数的调用是在定义的时候就调用
语法:
(function(形参){
代码段
})(实参)
//在大括号后面加小括号就是调用
eg:
(function(a,b){
var c = a + b;
document.write(c);
})(1,2);
6.函数的嵌套:
函数的嵌套就是在函数中调用函数
// 求数组中所有元素的平均数
/*分析:
1.先求和
2.再求平均数
*/
// 求和函数
function sum1(arr) {
var s = 0;
for(var i in arr){
s += arr[i];
}
return s;
}
// 求平均数函数
function avg1(arr) {
var sum = sum1(arr); // 在平均数函数内调用求和函数
var length = arr.length;
var a = sum/length;
return a;
}
// 调用
var arr = [1,6,9,7,2];
var avg = avg1(arr);
console.log(avg);
7.变量的声明提升:
预解析就是在代码中找变量和函数的定义,并提升到当前作用域的最上面(只提升声明,不提升赋值)
预解析分为变量的预解析和函数的预解析,也就是代码在执行之前先进行解析,将变量和函数的声名放在当前作用域的最前面。
1. 预解析js代码:
预解析的过程,就是查找代码中的var和function这两个关键字,找到以后,将变量和函数存到了一个地方,就叫仓库吧,并给他们赋一个初始值,变量的初始值为undefined,函数的初始值为代码段。
2. 开始按顺序一行一行解读代码:
解读代码的时候,仓库中的变量和函数的值会随着代码的解读而发生变化,也就是变量的赋值和函数的调用。
console.log(a); // 因为变量a没有声名过,所以会报错
test(); // 函数未定义,所以报错
// 1.变量预解析
console.log(a); // 因为变量a在执行之前进行了预解析,也就是已经放到内存中了,只是没有值,所以是undefined
var a = 1;
预解析相当于下面的过程
var a; // 将变量的声名放到当前作用域的最前面
console.log(a);
a = 1;
// 2.函数预解析
test(); // 结果:123 代码在执行之前经过预解析,将函数的内容放到了内存了,所以在下面的定义函数也能调用执行
function test(){
console.log(123);
}
预解析相当于下面的过程
function test(){ // 将函数声名放到当前作用域的最前面
console.log(123);
}
test();
总结:
- 用var关键字声名的变量,将变量的声名提升到当前作用域的最前面,赋值不提升
- 自定义的函数整体提升到当前作用域的最前面
- 函数同名,后面的会覆盖前面的
- 变量和函数同名,函数优先提升