函数形参、解构赋值、箭头函数

本文深入探讨JavaScript中函数的形参赋值、解构赋值、扩展运算符及this指向规则。通过实例讲解不同场景下this的指向变化,包括全局、自执行函数、回调函数及私有作用域中的行为。

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

函数形参

给函数形参赋值的时候,遇到变量先看是不是自己小括号中的,如果是就使用自己的,不是往上一级找

var m=2,x=10;
function fn(y=x) {
    var m=1,x=10;
    console.log(x);
    console.log(y);
}
fn()

解构赋值

美团面试题:

let arr = [[[[[[1,2,3],[4,5,6]]]]]];
 console.log(arr.toString());
 console.log(arr.join());
 console.log(""+arr)

遍历数组的索引和值

let arr = ["今","天","很","开","心"]
//解构赋值遍历索引和项
 for(var [index,item] of arr.entries()){
     console.log(index,item)
 }
//遍历索引
for(var index in arr){
    console.log(index)
}
//遍历选项
for(var item of arr){
    console.log(item)
}

扩展运算符

var str="12345";
console.log(str.split(""));
console.log([...str]);
var ary=[1,2,3,4,5];
var ary1=[6,7,8,9];
console.log(...ary);
console.log(ary.concat(ary1));
console.log([...ary, ...ary1]);
console.log(Math.max(...ary1));

this的指向问题:

1.在全局下,this指向window;

2,在自执行函数中,this指向window;

3,在回调函数(当做参数)中,this指向widow,但是有的地方可以修改

例如:window.setTimeout(obj.f,1000) 这里obj.f是当做一个参数传递  它的this仍然是指向window

4,私有作用域下,看函数执行的时候前面有没有点,有点,那么点前面是谁,this就是谁

注:箭头函数没有this指向,就看箭头函数的作用域this指向是谁,就是谁!!

箭头函数:

一般情况下,给元素绑定事件的时候不会使用箭头函数,他会使this指向window

<think>嗯,用户问的是C函数形参列表被赋值的问题。首先,我需要确认用户的具体疑问是什么。可能他们遇到了在函数参数列表中直接给形参赋值的情况,或者对形参赋值操作有疑问。 首先,回忆一下C语言中函数形参的基本概念。形参是在函数定义时声明的变量,用于接收调用时传递的实参值。它们的作用域仅限于函数内部,生命周期在函数执行期间存在。接下来,用户提到的“形参列表被赋值”可能有两种情况:一是在声明函数时给形参赋值,二是在函数体内对形参进行赋值。 第一种情况,比如在定义函数时写成void func(int a = 0),这在C语言中是不允许的,因为C不支持默认参数,而C++才支持。这时候需要指出语法错误。第二种情况是在函数内部对形参变量赋值,例如a = 5,这是允许的,但会影响函数内该形参的值,而不会影响实参,因为C语言是传值调用。 然后,需要考虑用户可能的误区,比如误以为修改形参会影响实参,或者可能他们看到某些代码中在参数列表里赋值,但实际上那是其他语言的特性,比如C++或JavaScript。需要区分C和其他语言的不同,避免混淆。 还要考虑示例代码的提供,帮助用户理解。例如,展示函数内部修改形参的情况,并说明实参不受影响。此外,如果用户混淆了形参和指针或引用的情况,可能需要进一步解释传地址的情况,但题目主要关注赋值操作本身。 另外,注意用户可能的问题来源,比如他们在调试时发现形参被修改后,实参没变,感到困惑。这时候需要强调传值调用的机制,形参只是副本,修改副本不影响原值。 总结回答结构时,应该先解释形参的基本概念,再分情况讨论赋值的情况,指出语法错误和允许的情况,并通过示例说明,最后总结注意事项。确保语言简洁,逻辑清晰,避免使用专业术语过多,用中文通俗解释。</think>在C语言中,函数形参列表的赋值问题需要分两种场景理解: ### 一、函数定义时的形参列表 1. **基本规则** C语言规定:函数形参列表中只能声明变量,不能直接赋值初始化。 ```c void func(int a = 5); // 错误!C语言不支持默认参数(C++才支持) ``` 2. **正确写法** ```c void func(int a); // 正确:仅声明形参类型和名称 ``` ### 二、函数内部对形参赋值 1. **允许的操作** 在函数体内,形参本质上是一个局部变量,可以自由修改其值: ```c void modify_param(int x) { x = x * 2; // 允许:修改形参的值 printf("%d", x); // 输出修改后的值 } ``` 2. **对实参的影响** 由于C语言采用**值传递**机制,函数内部对形参的修改不会影响调用方的实参: ```c int main() { int num = 10; modify_param(num); // 传递的是num的副本 printf("%d", num); // 仍输出10(原值未改变) } ``` ### 三、特殊场景:指针类型形参形参为指针类型,则可以通过指针间接修改原始数据: ```c void modify_through_pointer(int* p) { *p = 20; // 通过指针修改原始数据 } int main() { int num = 10; modify_through_pointer(&num); printf("%d", num); // 输出20(原值被改变) } ``` ### 总结注意事项 1. ✅ 形参列表内禁止初始化赋值(如`int a=5`) 2. ✅ 函数体内可以任意修改形参的值 3. 🔑 值传递机制下,普通类型的形参修改不影响实参 4. 🔑 指针/引用形参可通过间接操作影响原始数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值