javascript 闭包揭秘

closures 是一个对象包含一个内置方法和这个方法被创建时的作用域环境。

1 First-Class 方法:类似构造方法,可以返回任何的数据类型。

例子:

var foo = function() {
  alert("Hello World!");
};

var bar = function(arg) {
  return arg;
};

bar(foo)();

2 内置方法:嵌套方法,被定义在任何其他的方法中使用。当每次调用外部方法的时候,内置方法都会被创建。

function add(value1, value2) {
  function doAdd(operand1, operand2) {
    return operand1 + operand2;
  }

  return doAdd(value1, value2);
}

var foo = add(1, 2);

3 由于内置方法和外部方法共享一部分作用域,所以,内置方法可以访问外部方法的变量和实参。

function add(value1) {
  return function doAdd(value2) {
    return value1 + value2;
  };
}

var increment = add(1);
var foo = increment(2);
// foo equals 3

4 什么时候用闭包 当回调函数需要当做参数来调用的时候,就需要用到闭包了。

5 定时器 当调用setTimeout()和setInterval()方法时候就需要闭包的应用。

window.addEventListener("load", function() {
  var showMessage = getClosure("some message<br />");

  window.setInterval(showMessage, 1000);
});

function getClosure(message) {
  function showMessage() {
    document.getElementById("message").innerHTML += message;
  }

  return showMessage;
}

6  模拟变量和方法的私有化

function Person(name) {
  var _name = name;

  this.getName = function() {
    return _name;
  };
}

7 使用闭包的坏处  使js执行效率变慢会引起内存泄露。

8 循环中使用闭包 注意闭包的环境变量与实际的变量解耦

<script>
function getHandler(i) {
  return function handler() {
    alert("Clicked button " + i);
  };
}

window.addEventListener("load", function() {
  for (var i = 1; i < 4; i++) {
    var button = document.getElementById("button" + i);

    button.addEventListener("click", getHandler(i));
  }
});
</script>

总结:

1 闭包包含了一个方法和创建这个方法的时候的独立的作用域环境

2 闭包当一个外部方法需要暴露一个内部方法的作用域的时候就被形成了

3 闭包可以通过参数来调用方法

4 闭包可以实现模拟私用数据

5 闭包不可以过度使用 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

出处:http://www.sitepoint.com/javascript-closures-demystified/

posted @ 2015-08-17 10:42  一渡  阅读(95)  评论(0)    收藏  举报