JavaScript中的闭包

什么是闭包,闭包的定义是什么

函数和其本身对周围状态的引用两者捆绑在一起构成闭包。也即是说闭包可以从函数内部访问外部的作用域,在js中,每当函数创建时,就会在函数生成时生成闭包。

闭包是js函数作用域的副产品,正是由于JS函数内部可以访问函数外部变量的设定符合了闭包的定义,所以才会有了闭包。

闭包是什么样子的

eg.1:
var name = 'zhang san';
function show() {
    console.log(show);
}

show() // zhang san 

以上例子完全满足闭包的定义:函数内部可以访问函数外部的变量,这就是一个简单的闭包。

eg.2:
function foo(){
  var local = 1
  function bar(){
    local++
    return local
  }
  return bar
}

var func = foo()
func() // 2

上面这个是创建闭包的常见方式,即在一个函数内部创建另一个函数;
在这上面函数bar与变量local组成了一个闭包;
函数bar,return出来,是为了能够在函数foo外能够访问函数bar;如果不return出来,在函数foo外就无法使用这个函数,把return改为window.bar=bar是一样的;所以return bar只是为了bar能被使用,和闭包无关。

eg.3:
var foo = {};

// 初始化
(function (object) {

  var x = 10;

  object.getX = function() {
    return x;
  };

})(foo);

alert(foo.getX()); // 10

立即执行函数与闭包结合使用,匿名函数内部的变量x函数外无法访问,通过函数getx对外暴露出内部变量,这就形成了闭包;
闭包和立即执行和书没有必然联系,只是有时想用到闭包那么可以用(function(){})()来构成闭包,而不是(function(){})()是闭包。

闭包的使用场景

1.利用闭包实现模块化

(function () {
  var a = 10;
  var b = 20;

  function add(num1, num2) {
    var num1 = !!num1 ? num1 : a;
    var num2 = !!num2 ? num2 : b;

    return num1 + num2;
  }

  window.add = add;
})();

add(10, 20);

2.采用函数引用方式的setTimeOut调用(原生的setTimeout传递的第一个函数不能带参数)

function f1(a) {
    function f2() {
        console.log(a);
    }
    return f2;
}
var fun = f1(1);
setTimeout(fun,1000);

引用参考来源

「每日一题」JS 中的闭包是什么?

前端基础进阶(五):闭包

闭包的概念以及使用场景

闭包的使用场景

你可能感兴趣的:(JavaScript中的闭包)