JavaScript 有哪些关于闭包的经典用法?

diguage · 2014年03月10日 · 最后由 yfractal 回复于 2014年03月11日 · 2935 次阅读

在知乎提了个问题:有哪些关于闭包的经典用法?。无人回答,发到这里,大家一起来讨论讨论!

看 JavaScript 等方面的书,在讲解闭包时,经常提到“如果用好闭包,能多么多么方便,多么多么牛逼”。但是,我自己在写代码的时候,总是找不到这种“牛逼的赶脚”。(也许我水平有限,还没吃透。呵呵)

请问,有哪些关于闭包的经典用法?

请结合 JavaScript代码来说明。无码无真相!

请结合需求来提问。无需求无代码!

另外闭包不是万能的,滥用容易造成内存泄漏。什么技术都是适用才好。

(function(win, jq, undefined){
  jq(function($){
    console.log($(document));
  });
})(window, jQuery);

#1 楼 @billy 要的是 经典代码。就是同一场景下,普通代码和闭包写法的优缺点对比。不过,仍然谢谢回复!哈哈

说多么多么牛逼的是为了装逼,正式项目中把成熟框架活学活用就够了,真正牛逼的程序员不需要通过各种装逼的写法来显示自己有多牛,而是用最简单的大家都能懂方式化腐朽为神奇。不过闭包的工作原理还是应该理解的,这样可以明白 javascript 的底层工作方式。

你一定看错书了

隐藏内部变量

counter = (function(){
  var count = 0
  return function(){
    console.log(count += 1)
  }
})()
counter()
counter()

#2 楼 @song940 这个代码使用闭包了吗?

匿名 #8 2014年03月10日

其实主要就是用来封装啦,或者说是像 #6 说的那样,隐藏内部变量。

类似的例子:

var logger_a = (function () {
  var buffer = [];

  return {
    put: function (c) {
       buffer.push(c);
       return this;
    },
    toString: function () {
       return buffer.join('');
    }
  };
}());

用的时候就是 logger_a.put('dsfasd') 这样。

当然,不用闭包也一样可以,例如(不知道有没有写错……):

function Logger() {
  var buffer = [];

  this.put = function (c) { buffer.push(c); return this; }
  this.toString = function () { return buffer.join(''); }
}
var logger_b = new Logger();

这个也是一样用。

最近 JavaScript 好火啊

currying:

var add = function(a) {
  return function(b) {
    return a + b;
  }
}

a(1)(2);
var that = this
$('#button').click(function(){
    that.foo(this)
})

underscore 的_.partial 算不算?

(我一直把闭包当 curry 用,需要的话,就丢进去。)

需要 登录 后方可回复, 如果你还没有账号请 注册新账号