有不少开发人员总是搞不清匿名函数和闭包这两个概念,因此经常混用。闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数,仍以前面的createComparisonFunction()函数为例,注意value1和value2:

  1. function createComparisonFunction(propertyName) {
  2. return function(object1, object2){
  3. var value1 = object1[propertyName];
  4. var value2 = object2[propertyName];
  5. if (value1 < value2){
  6. return -1;
  7. } else if (value1 > value2){
  8. return 1;
  9. } else {
  10. return 0;
  11. }
  12. };
  13. }

闭包与变量

作用域链的这种配置机制引出了一个值得注意的副作用,即闭包只能取得包含函数中任何变量的最后一个值。别忘了闭包所保存的是整个变量对象,而不是某个特殊的变量。下面这个例子可以清晰地说明这个问题:

  1. function createFunctions(){
  2. var result = new Array();
  3. for (var i=0; i < 10; i++){
  4. result[i] = function(){
  5. return i;
  6. };
  7. }
  8. return result;
  9. }

最终结果每个函数都返回 10

但是,我们可以通过创建另一个匿名函数强制让闭包的行为
符合预期,如下所示:

  1. function createFunctions(){
  2. var result = new Array();
  3. for (var i=0; i < 10; i++){
  4. result[i] = function(num){
  5. return function(){
  6. return num;
  7. };
  8. }(i);
  9. }
  10. return result;
  11. }

关于this对象

具体使用场景如下:

  • 做为普通函数 直接返回window
  • 使用call、apply、bind 传入什么就绑定什么
  • 作为对象方法被调用 就返回对象本身
  • 在calss类中被调用 当前实例本身
  • 箭头函数 找上级作用域的this

⚠️: this取什么值是在函数执行时确定的,不是在函数定义时确定的

闭包的优点和弊端

  • 闭包的好处:

    1.希望一个变量长期保存内存中; 2.避免全局变量污染;

3私有成员的存在。

  • 闭包的缺点:

    1.常驻内存,增加内存使用量;

2.使用不当造成内存泄漏。