函数扩展,函数参数的默认值,箭头函数

本文详细介绍了JavaScript中函数参数的默认值、rest参数和箭头函数的使用。函数参数默认值允许在定义时设定默认值,需要注意其在作用域中的行为。rest参数用于收集函数多余的参数,它是一个真正的数组,可以使用数组方法。箭头函数提供了简洁的函数定义方式,并且其this值指向函数定义的位置,而非调用位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.函数参数的默认值

ES6之前,不能为函数的参数设置默认值,只能在代码中进行判断

function show(a,b){
    if(typeof b === "undefined"){
         b = 0;
    }
    console.log(a,b);
}
show(1);

ES6的写法

function show(a,b=0){
	console.log(a,b);
}
show(1);

设置默认值的参数应该在函数的最后面,否则默认值设置是无效的。

 function show(a=0){
 console.log(a,b);
 }
 show(1)//1 undefined

函数的length属性为函数的参数个数。若设置了默认值,length的计数中是不计算设置了默认值的参数的。

作用域

一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域。

等到初始化结束,这个作用域就会小时。

var a = 1;
function fn(a,b = a){
    console.log(b);
}
fn(2)//2
let a = 1;
function fn(b = a){
    let a = 2;
    console.log(b);
}
fn();//1

函数调用中,(b=a)是一个单独的作用域,a变量不存在,则会去外部寻找。

2.rest参数

2.1 基本用法

        function add(...v){
            for (var i = 0; i < v.length; i++) {
               console.log(v[i])
            }
            
        }
        add(2,1,3)

rest参数必须是最后一个正式参数。

        //错误写法
        function add(...v,a){
            
        }  

2.2 rest参数和arguments对象的区别

arguments对象不是一个数组,只是一个类似数组的对象。不能使用数组的方法。

rest参数是一个真正的数据,所以可以使用数组的方法

function sort(...v){
    // return arguments.sort(); 报错
    return v.sort()
}
console.log(sort(3,1,4,8));

3.箭头函数

3.1 定义

箭头函数是对于匿名函数表达式的一种简写方法。

3.2 语法

//普通匿名函数
var a = function(a,b){

}
//箭头函数
//()形参的位置
//=> 箭头函数的标志
//{} 函数代码块
var a=(a,b)=>{}
var fn = function(a,b){
    console.log(a+b);
    console.log("我是普通匿名函数");
}
fn(10,20);
var fn2 = (a,b)=>{
    console.log(a+b);
    console.log("我是箭头函数");
}
fn2(10,20);

3.3 其他写法

如果箭头函数只有一个形参,则可以省略小括号。

var fn = a =>{
       console.log(a);
}

如果只包含一个语句,则省略{}和return。

var fn = a => a*a

箭头函数中没有arguments对象。

var fn = a => {
   console.log(arguments.length);//报错
}

3.4 箭头函数中this指向

箭头函数内部的this是由上下文确定的。

它会找到自身定义的位置中的this值,作为自身的this。

let div = document.querySelector("div");
    div.onclick = function(){
        console.log(this);//div
    }
    div.onclick = ()=>{console.log(this);}//window
    div.onclick = function(){
         let fn = function(){
             console.log(this);
         }
         fn();//window
        //let fn = ()=>{
        //  console.log(this);
        //}
        //fn();//div
    }
    let obj = {
        name:"亚索",
        fn:function(){
            console.log(this);
        },
        fun:()=>{
            console.log(this);
        }
    }
    obj.fn();//obj
    obj.fun();//window

//指向

### JavaScript 箭头函数与普通函数的区别 #### 语法形式差异 普通函数定义采用 `function` 关键字,而箭头函数则通过更简洁的方式声明。对于无参情况或单个参数的情况,箭头函数可以省略圆括号;当函数体只有一条语句时,大括号也可以被省去并隐式返回结果[^2]。 ```javascript // 普通函数 function add(a, b) { return a + b; } // 箭头函数 const add = (a, b) => a + b; // 单个参数箭头函数可省略括号 const square = x => x * x; ``` #### This绑定机制的不同 传统意义上的函数内部存在自己的`this`上下文环境,在调用方式改变的情况下其指向也会随之变化。相比之下,箭头函数并不具备自身的`this`值而是继承自外层最近的作用域即词法作用域内的`this`[^3]。 ```javascript var obj = { value: 'outer', func1: function() { console.log(this.value); // outer setTimeout(function(){ console.log(this.value); // undefined 或 window/global 对象上的value属性取决于严格模式与否 }, 10); setTimeout(() => { console.log(this.value); // outer }, 10); } }; obj.func1(); ``` #### 参数默认值和剩余运算符的支持程度 两者都支持ES6新增特性如默认参数值设定以及利用扩展操作符来收集不定数量实参与传递给其他方法调用。 ```javascript // 默认参数 let greet = (name='Guest') => `Hello ${name}`; console.log(greet()); // Hello Guest // 剩余/展开运算符 let sumAll = (...args) => args.reduce((acc,num)=> acc+num ,0 ); console.log(sumAll(1,2,3)); // 6 ``` #### 返回对象字面量需注意的地方 如果希望从箭头函数里直接返回一个对象,则需要用额外的一对圆括号包裹住整个对象表达式以避免混淆解析器[^4]。 ```javascript const getPersonInfo = () => ({ name:"John", age:30 }); console.log(getPersonInfo()); ``` #### 构造新实例的能力对比 由于缺乏原型属性(`prototype`)的原因,无法借助new关键字创建基于箭头函数的新对象实例。 ```javascript try{ let ArrowFuncAsConstructor = new (()=>{}) ; }catch(e){ console.error('Cannot construct with an arrow function'); } ``` ### 使用场景建议 考虑到上述特点: - 当需要保持当前执行上下文中`this`指针不变时优先选用箭头函数; - 如果涉及到事件监听器注册、定时器回调等异步操作中维持原有`this`引用关系的情形下推荐使用箭头函数; - 若要实现类构造器或者依赖于自有`this`特性的场合应当坚持运用常规函数形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值