思路
要保证一个函数只能调用一次, 必须有个 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() 中, 前者属于后者的全局变量. 这涉及到了闭包的作用域链, 可自行搜索.
来源: http://www.jianshu.com/p/458fa35fd27f