思路
要保证一个函数只能调用一次,必须有个flag变量判断函数是否被调用。这个变量按理说是个全局变量,但是我不希望这个flag污染全局变量池,由此我想到了使用闭包。
function once(fn) {
var flag = false
return function() {
if(!flag) {
flag = true
fn.call(this,...arguments)
}
}
}
let fn = function(m, n) {
console.log(m + n)
}
let a = once(fn)
a(2,3) // 5
a(3,4) // 不会执行打印
总结
这样写的好处是flag
变量不会污染全局变量痴。但是相对而言,其实called
变量在函数once()
中,前者属于后者的全局变量。这涉及到了闭包的作用域链,可自行搜索。
网友评论