Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
本题难度:⭐
答:
const add = (function () {
let i = 0
return function () {
return ++i
}
})()
console.log(add())// 1
console.log(add())// 2
复制代码
本题实际上考察的是闭包,上面是用立即执行函数实现的,也可以不用立即执行函数。
这里 i 就是函数 add 的私有变量,会保留在内存中。
function add () {
let i = 0
return function () {
return ++i
}
}
const temp = add() // 先用一个临时变量接收执行 add 的返回值,再调用 temp()
console.log(temp()) // 1
console.log(temp()) // 2
// 如果直接写 add()() 不会生效
复制代码
如果再实现得仔细一些,可以用一个对象把要操作的函数包起来,返回这个对象。
比如下面这个函数 fn,每调用一次,函数输出值 +1,操作的就是私有变量 i。
function fn () {
var i = 0
return { // fn 函数返回一个对象,有 get、set 等方法,来操作私有变量 i
get: function () {
return i
},
set: function (val) {
i = val
},
increment: function () {
return ++i
}
}
}
const counter = fn() // 执行 fn 函数,拿到 counter 对象
counter.get() // 0
counter.set(3)
counter.increment() // 4
counter.increment() // 5
复制代码
如果我们试图从全局作用域直接访问 counter.i
,会得到 undefined,因为 i
是定义在函数 fn 作用域内的变量,它并不是 counter
的属性。同样的,如果我们试图访问 i
也会收到错误,因为 i
并没有在全局作用域中定义。
这个i 就可以当作函数 fn 的私有变量,即使 fn 执行完毕被垃圾回收机制回收了,i还是会保存在闭包中,依然可以访问、操作。
结尾
如果我的文章对你有帮助,你的?就是对我的最大支持^_^
我是阿林,输出洞见技术,再会!
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END