JavaScript基础知识:函数进阶(一)

本文深入探讨JavaScript中的Rest参数与Spread语法的区别及其应用场景,同时解析变量作用域、闭包的概念及其工作原理。

JavaScript基础知识:函数进阶(二)
JavaScript基础知识:函数进阶(三)


一、Rest参数和Spread参数

当我们在代码中看见 ’ … '时,它要么是 rest 参数,要么就是 spread 语法。
-区分方法:
*若 … 出现在函数参数列表末尾,则是 rest 参数,它会把剩余的参数放到一个数组中;
*若 … 出现在函数调用或类似的表达式中,则为 spread 语法,它会将一个数组展开为列表。

-使用场景:
*rest参数:用于创建可传任意参数的函数;
*spread语法:用于将数组传递给需要许多参数列表的函数;

Rest

function sumAll(...args){  //args为数组名
	let sum = 0;
	for(let item of args ){
		sum += item;
	}
	return sum;
}
alert(sumAll(1,2,3,4));   //10

Spread

let arr = [1,2,3,4,5];
alert(Math.max(arr));  // NAN
alert(Math.max(...arr));  // 5

二、变量作用域及闭包

1.嵌套函数

函数中可以返回一个嵌套函数,它可以作为一个新对象属性结果返回

2.词法环境

1)关于词法环境:理论上存在,用于理解事物如何运作的对象
在这里插入图片描述

2)变量与函数声明:

  **变量**

在这里插入图片描述
**函数在使用变量时,会从内到外依次在语法环境中寻找目标变量,使用最新值 **

**函数声明**

在这里插入图片描述

3)返回函数
在这里插入图片描述
在执行makeCounter的时候创建了一个函数,但并未执行它。所有的函数在创建时,都会记住它创建时的词法环境,也就是说,所有的函数都有名为 [[Environment]] 词法环境,该属性保存了对创建该函数的词法引用

function makeCounter(){
//	console.log('刚进入:',count);
//程序执行进入函数开始,变量进入“未初始化”状态,直到遇见let定义
//否则会报错:ReferenceError: Cannot access 'x' before initialization
	let count=0;
	console.log('count后:',count);
	return function(){
		console.log('进入:',count);  
		return count++;
	}
}

let counter = makeCounter();
alert(counter());
alert(counter());

在这里插入图片描述
在这里插入图片描述

原理:
当调用 counter() 时,会为该调用创建一个新的词法环境,并且其外部词法环境引用获取于 counter.[[Environment]]:
在这里插入图片描述

3.闭包

1)含义:指内部函数总是可以访问外部函数的变量和参数,即使外部函数被返回之后(被终结);

javascript函数会自动通过隐藏的 == [[Environment]] == 属性记录创建它们的位置,所以他们都可以访问外部变量(即所有函数都是闭包,除了new function 中的例外)

4.垃圾回收

如果对该函数没有引用,那么该函数的词法环境与变量会被回收,从内存中删掉。

关于语法环境的详细解释参见:链接: link.

以上内容参考于https://zh.javascript.info/object-methods,在此学习记录。。。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值