javascript 闭包详解

  javascript 闭包是一个很有趣的东东。看了些相关资料http://www.glzy8.com/article/29472.htm,对其印象最深刻的是:实现了public 和private。

  创建一个非匿名闭包最简单的语法是:

  

复制代码 代码如下:

  var obj = (function(){//各种代码  });

  闭包最经典的例子:

  

复制代码 代码如下:

  var makeCounter = (function () {

  var i = 1;

  this.test=function(){

  console.log(i);

  i++;

  }

  return this;

  });

  var obj = makeCounter();

  obj.test(); // 1

  obj.test(); // 2

  var obj1 = makeCounter();

  obj1.test(); // 1

  obj1.test(); // 2

  private 与 public :

  

复制代码 代码如下:

  var makeCounter= (function () {

  var i = 1;

  //这货是private的

  function log(){

  console.log(i);

  i++;

  }

  //这货是public的

  this.test(){

  log();

  }

  return this;

  });

  var obj = makeCounter();

  obj.test(); // 1

  obj.test(); // 2

  obj.log(); //undefined

  自执行函数:

  第一次看到这样的代码时的感觉是:好高级;

  

复制代码 代码如下:

  var obj = (function(window){

  //各种代码

  }(window));

  然后google了下,发现他们经常都会这样写:

  

复制代码 代码如下:

  var obj= (function () {

  var i = 1;

  this.test=function(){

  console.log(i);

  i++;

  }

  return this;

  }());

  obj.test(); // 1

  obj.test(); // 2

  最简单的理解,程序员偷懒把两步写成了一步。

  

复制代码 代码如下:

  //这是一个函数。它应该这样用obj()

  var makeCounter = function () {

  //各种代码

  }

  //这是一个对象。它类似于 var obj = makeCounter();

  var obj = (function () {

  //各种代码

  }());

  它也可以有参数:

  

复制代码 代码如下:

  var output = "new test";

  var obj = (function (msg) {

  this.test = function(){

  console.log(msg);

  }

  return this;

  }(output));

  obj.test();

  它还可以更复杂更高级点:

  

复制代码 代码如下:

  var output = "new test";

  var obj = (function (obj, msg) {

  //这货也是私有的。类似obj.i(!=obj.i),却又不是obj.i(因为外部不可访问)。

  var i = 1;

  //private

  function log() {

  console.log(i + " : " + msg);

  i++;

  }

  //public

  obj.test = function () {

  log();

  }

  return obj;

  }(obj, output));

  obj.test(); // 1 : new test

  obj.i = 100;

  //i没被改变

  obj.test(); // 2 : new test

  初次见面,留下了很深刻的印象。闭包的使用,实现了状态,属性的保持;避免了全局变量满屏飞舞;结束了变量老是被重定义,重赋值的尴尬局面。它还可以将一个对象分部到多个js文件。实在是太好了。

  上面所述就是本文的全部内容了,希望大家能够喜欢。