针对“深入理解JavaScript函数参数与闭包”的攻略,我会先介绍一下函数参数的概念以及它们的类型和用法,然后再进行闭包的详细讲解和示例说明。
一、函数参数
函数参数是在函数定义时声明的,用于接受传递给函数的值。JavaScript中函数参数有两种类型:形式参数和实际参数。
1.1 形参和实参
函数定义时,使用括号包裹形参,形参不需要具体的值,其只是一个占位符,用于标识参数的类型或名称。函数在被调用时,使用实参对形参进行赋值,实参是实际传入的值。
示例:
function add(num1, num2) { // num1, num2为形参
return num1 + num2;
}
add(1, 2); // 1, 2为实参
1.2 默认参数
在ES6中,你可以给函数的形参设置默认值。这样,当实参没有传入相应参数时,将会使用默认值。
示例:
function sayHi(name = 'default') { // name 设置默认值为'default'
console.log(`Hello ${name}!`);
}
sayHi(); // 'Hello default!'
sayHi('Tom'); // 'Hello Tom!'
1.3 剩余参数
剩余参数可以用来代替函数当中需要的多个参数。
示例:
function sum(...args) { // 使用剩余参数...
return args.reduce((a, b) => a + b);
}
sum(1, 2, 3, 4, 5); // 15, args = [1, 2, 3, 4, 5]
二、闭包
闭包是一个函数和其所在的环境组合而成的一个对象,该对象可以访问其定义时的环境中的变量和函数。这些变量和函数的引用被保存在闭包内,不会被垃圾回收机制回收掉。
2.1 闭包的形成
当一个嵌套的函数(内部函数)访问外部函数的变量时,闭包就形成了。下面是一个简单的示例:
function outer() {
let a = 'hello';
function inner() {
console.log(a);
}
return inner;
}
let innerFn = outer();
innerFn(); // 'hello'
在上面的示例中,inner
函数访问了外部的变量a
,从而形成了闭包。
2.2 闭包的应用
闭包常用于保护变量以及封装函数。
保护变量:
function counter() {
let count = 0; // count受到闭包保护
return function() {
return ++count;
}
}
let inc = counter();
console.log(inc()); // 1
console.log(inc()); // 2
console.log(inc()); // 3
封装函数:
function createPerson(name) {
let age = 0;
return {
getName() {
return name;
},
getAge() {
return age;
},
setAge(newAge) {
age = newAge;
}
}
}
let person = createPerson('Tom');
console.log(person.getName()); // Tom
console.log(person.getAge()); // 0
person.setAge(20);
console.log(person.getAge()); // 20
在上面的示例中,createPerson
函数返回一个对象,该对象包含几个方法,并使用闭包保护了age
变量,同时也保护了name
变量。
以上是“深入理解JavaScript函数参数与闭包”的一些内容,希望能够帮助到你。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解javascript函数参数与闭包 - Python技术站