以下解释为Javascript闭包。
我们都知道一个概念。
在JS当中,一个函数可以访问其外部的变量资源。
一个典型的代码
但以下这种情况会出错。
function m1(){ var a = 100; console.log(a++); } function m2(){ console.log(a++); //这里无法访问a }
如果,我们想在m2的作用域里,访问m1里的变量,就像下面这样:
首先,我们可以在m1的内部创建一个函数m3
function m1(){ var a = 100; function m3(){ console.log(a++); } }
m3可以正常访问a,接下来我们增加一个return操作。
function m1(){ var a = 100; return function m3(){ console.log(a++); } }
既然有了返回值,那我们不妨接收一下,继续编写代码如下:
function m1(){ var a = 100; return function m3(){ console.log(a++); } } var _m3 = m1();
我们执行了函数m1, 并将返回值赋值给_m3,
那么目前_m3和m3函数是等价的,即它们是同一个函数。
有了_m3,一切都好办了。我们继续编写代码
function m1(){ var a = 100; return function m3(){ console.log(a++); } } var _m3 = m1(); function m2(){ _m3(); }
因为_m3是全局变量,因此m2可以调用_m3
也就等价于m2间接的,访问到了变量a
通常,我们管m3,叫做一个『 闭包函数 』
下面列举几个常见的闭包场景:
for(var i=0; i<list.length; i++){ var item = list[i]; item.Onclick= (function(num){ return function(){ //…… } })(i); }
function (){ var that = this; setTimeout(function(){ //…… },2000) }
function User(){ var _age = 0; this.getAge = function(){ return _age; } this.setAge = function(age){ this._age = age; } }
(function(){ var cache = […]; return { get : function(){ //… } }; })()
(function(){ var t = null; return function(){ if(!t){ t = create(); } } })()
原创文章,作者:普尔小编,如若转载,请注明出处:http://www.puerpx.cn/pxwd/10630.html