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,在此学习记录。。。