函数
函数基础
• 函数命名规则
不能数字开头 ,可以用字母 _ $ 开头
驼峰命名法 复合单词 myWonder
• 函数声明
function test(a, b, c){
//执行语句;
}
• 匿名函数表达式
var test = function test1(){
//执行语句;
};
console.log(test.name);// test1
test(); // 调用函数
test1(); // Uncaught ReferenceError: test1 is not defined at <anonymous>:1:1
// test1对函数外部不可见
• 函数组成部分
//function 函数名 参数(可选) return返回值(可选)
//占位符 -> 形参
function test(a,b,c){
console.log(a ,b, c)
}
//实际参数 -> 实参 参数没有数据类型
//形参和实参数量可以不相等
test(1,2);
test(1,2,3);
function test(a, b){
console.log(test.length);// 获取形参的长度
console.log(arguments.length) // 获取实际参数的长度
}
• return
• 每个函数最后一定是return,如果没写,js会隐式的加上return undefined ,return之后的语句不再执行
- 终止函数的执行
- 返回一个值
- 没有写return 默认return undefined
形参与实参
• 映射关系
• 函数内部是可以修改实参值的
• 实参和形参不是同一个变量,但是存在映射关系,当形参进行改变的时候,实参也会跟着改变
• 映射关系并不意味着形参和实参访问同一个内存地址,它们在内存中还是分开的,只是内部的机制使它们的值保持了同步。
//修改形参值,实参跟着变
function test(a,b){
a = 3;
console.log(arguments[0]); //输出3
}
test(1,2);
//修改实参值,形参跟着变
function test(a,b){
arguments[0] = 3;
console.log(a); //输出3
}
test(1,2);
• 如果没有实参,就没有映射关系
• 如果没有在实参中传递,即使在函数内部对形参进行了赋值,arguments仍认为其是undefined, 因为arguments 对象的长度是根据实参的个数决定的
function test(a,b){
a = 3;
b = 4;
console.log(arguments[0] +"," + arguments[1]);
}
test(1);// 3,undefined
参数默认值
• 初始化函数的参数默认值:undefined
function test(a, b){
console.log(a+","+b);
}
test(1); //1,undefined
• 设置参数默认值
• 方法1:在函数声明的括号里给形参赋默认值
• 缺点:不兼容低版本的浏览器
• 若实参传了值,则给形参设置的默认值会失效
• 给形参设了默认值后, 实参和形参会失去映射关系
在使用默认参数时, arguments 对象的值不反映参数的默认值,只反映传给函数的参数;修改命名参数也不会影响 arguments 对象,它始终以调用函数时传入的值为准。
function test(a = 3,b = 4,c = 5){
b = 6;
console.log(a + "," + b + "," + c); // 1,6,5
console.log(arguments[0] + "," + arguments[1] + "," + arguments[2]); // 1,2,undefined
}
test(1,2);
// 实参a已传递,形参a赋默认值 -> 默认值失效,形参a和arguments都按照实参值输出
//实参b已传递,形参b赋默认值,然后在函数运行时修改b值 -> 设置默认滞后,映射关系失效,形参b按修改值输出,arguments仍按实参值输出
//不传入实参c,形参c赋默认值 -> 形参c按默认值输出,arguments为undefined
• 方法2 用逻辑运算符 ||
• 或||:遇到真则返回,遇到假则往后走,若走到最后面,返回最后一个值
• 缺点:若实参值为null undefined NaN “” 0 false,会被 || 运算判断为false,继续往后走
function test(a, b){
var a = arguments[0] || 1;
var b = arguments[1] || 3;
console.log(a + "," +b);
}
test(0, 2);//输出 1,2
• 方法3 手动判断是否传参
此方法不存在兼容性问题
function test(){
var a ,b;
if(typeof (arguments[0]) !== "undefined"){
a = arguments[0];
}else{
a = 1;
}
console.log(a + "," + b);
}
test(0);// 输出0,undefined
test();// 输出 1,undefined