day45-闭包的小例子

封装变量

在平时运用中,闭包用的比较多的还是对于函数或者变量的封装。本文借鉴一个小例子,示范闭包的应用。


原函数

let mult = function () {
let a = 1
for (let i = 0; i < arguments.length; i++) {
a = a * arguments[i]
}
return a
}
console.log(mult(1, 2, 3)) // 6

封装变量

let cache = {} // 注意是全局变量
let mult = function () {
let args = Array.prototype.join.call(arguments, ',')
if (cache[args]) {
return cache[args]
}
console.log('==')
let a = 1
for (let i = 0; i < arguments.length; i++) {
a = a * arguments[i]
}
return cache[args] = a
}
console.log(mult(1,2,3))
console.log(mult(1,2,3))
// ==
// 6
// 6

优化全局变量

  • 很错误的方法啊!

    let mult = function () {
    let cache = {}
    let args = Array.prototype.join.call(arguments, ',')
    if (cache[args]) {
    return cache[args]
    }
    console.log('==')
    let a = 1
    for (let i = 0; i < arguments.length; i++) {
    a = a * arguments[i]
    }
    return cache[args] = a
    }
    console.log(mult(1, 2, 3))
    console.log(mult(1, 2, 3))
    // ==
    // 6
    // 6
  • 正确方法之一

    let mult = (function () {
    let cache = {}
    return function () {
    let args = Array.prototype.join.call(arguments, ',')
    if (cache[args]) {
    return
    }
    let a = 1
    for (let i = 0; i < arguments.length; i++) {
    a = a * arguments[i]
    }
    return cache[args] = a
    }
    })()
    console.log(mult(1, 2 ,3))
    console.log(mult(1, 2 ,3))
    // ==
    // 6
    // 6

提炼函数

let mult = (function () {
let cache = {}
let calculate = function () {
let a = 1
for (let i = 0; i < arguments.length; i++) {
a = a * arguments[i]
}
return a
}
return function () {
let args = Array.prototype.join.call(arguments, ',')
if (args in cache) {
return cache[args]
}
console.log('++')
return cache[args] = calculate.apply(null, arguments)
}
})()
console.log(mult(1, 2, 3))
// 6

以上就是我要说的话了,show code.
–end

文章作者: lmislm
文章链接: http://lmislm.com/2019/02/24/2019-02-24/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LMISLMのBlog