ECMAScript - 函数基础、形参与实参、参数默认值

函数基础

• 函数命名规则

不能数字开头 ,可以用字母 _ $ 开头
驼峰命名法 复合单词 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之后的语句不再执行

  1. 终止函数的执行
  2. 返回一个值
  3. 没有写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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值