基础案例
function createFn () {
let name = 'ming';
}
createFn();
// 执行完createFn,里面的变量name会释放掉
function createFn () {
let name = 'ming';
return function() {
console.log(`my name is ${name}`);
}
}
let getName = createFn(); //函数中,返回了一个函数 而且在函数中还访问了原来函数内部的成员
getName(); // my name is ming
// getName为外部函数,当外部函数对内部成员有引用的时候,那么内部的成员name就不能被释放。当我们调用getName的时候,我们就会访问到name。
复制代码
闭包的概念
闭包:函数和其周围的状态(词法环境)的引用捆绑在一起形成闭包(闭包让你可以在一个内层函数中访问到其外层函数的作用域)
- 可以在另一个作用域中调用一个函数的内部函数并访问到该函数作用域中的成员
闭包的核心作用
把函数内部成员的作用范围扩大
闭包的本质
函数在执行的时候会放到一个执行栈上,当函数执行完毕之后会从执行栈上移除。但是堆上的作用域成员因为被外部引用不能释放,因此内部函数依然可以访问外部函数的成员。
- 解读:函数执行的时候在执行栈上,执行完毕之后从执行栈上移除,内部成员的内存被释放。但是在函数执行完毕移除之后,释放内存的时候,如果外部有引用,则内部成员的内存不能被释放。
闭包的案例
案例一
计算一个数平方和立方的运算
Math.pow(4, 2)
Math.pow(5, 2)
// 后面的二次方三次方很多次重复,下面要写一个二次方三次方的函数
function makePower (power) {
return function (number) {
return Math.pow(number, power)
}
}
// 求平方
let power2 = makePower(2)
let power3 = makePower(3)
console.log(power2(5)) // 25
console.log(power2(6)) // 36
console.log(power3(5)) // 125
复制代码
案例二
计算不同级别的员工工资
// 假设计算员工工资的函数第一个函数传基本工资,第二个参数传绩效工资
// getSalary(12000, 2000)
// getSalary(15000, 3000)
// getSalary(15000, 4000)
// 不同级别的员工基本工资是一样的,所以我们将基本工资提取出来,之后只需要加上绩效工资
function cretateSalary (base) {
return function (performance) {
return base + performance
}
}
let salaryLevel1 = cretateSalary(12000)
let salaryLevel2 = cretateSalary(15000)
console.log(salaryLevel1(2000)) // 14000
console.log(salaryLevel2(3000)) // 18000
console.log(salaryLevel2(4000)) // 19000
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END