闭包(closure)是Javascript语言的一个难点,也是它的特点,不少高级应用都要依靠闭包实现。 关于闭包的概念,咱们须要了解js的变量。 首先js的变量能够是任何东西,属性、方法、对象,均可以做为变量。变量分为全局变量和局部变量。在Js中函数的内部能够读取全局变量,这点和JAVA类似。闭包
var i=100; function f1(){ alert(i); } f1();//100
可是局部变量,却不能在外边直接使用,这点也和Java类似,会出现错误。函数
function f1(){ var i=100; } f1(); alert(i);//i is not defined
值得注意的一点,就是什么内部变量的时候,必定要注意使用var。否则的话你申明的就是一个全局变量。code
function f1(){ i=100; } f1(); alert(i);//100
由此能够看出来,就是把一下不须要用在全局的变量,放到一个封闭的空间(函数、对象、命名空间)中,可是咱们却须要里面的一些变量,那么这个时候就须要闭包了,闭包就是连接外部函数和内部函数的桥梁。。对象
###2.调用局部变量ip
通常而言,咱们须要调用一个简单的局部变量是不能实现的。作用域
function f1(){ var i=100; } alert(f1.i);//undefined
咱们须要使用返回值,获取内部内部变量。rem
function Counter(start) { var count = start; return { increment: function() { count++; }, get: function() { return count; } } } var result = Counter(4); console.log(result.increment()); console.log(result.get());
这里,Counter 函数返回两个闭包,函数 increment 和函数 get。 这两个函数都维持着 对外部做用域 Counter 的引用,所以总能够访问此做用域内定义的变量 count。get
###3.循环中闭包io
for(var i = 0; i < 10; i++) { setTimeout(function() { console.log(i); }, 1000); }
上面的代码不会输出数字 0 到 9,而是会输出数字 10 十次。 当 console.log 被调用的时候,匿名函数保持对外部变量 i 的引用,此时 for循环已经结束, i 的值被修改为了 10. 为了获得想要的结果,须要在每次循环中建立变量 i 的拷贝。console
使用下面方式
for(var i = 0; i < 10; i++) { setTimeout((function() { console.log(i); })(i), 1000); }
自执行匿名函数: 常见格式:(function() { /* code */ })(); 解释:包围函数(function(){})的第一对括号向脚本返回未命名的函数,随后一对空括号当即执行返回的未 命名函数,括号内为匿名函数的参数。 做用:能够用它建立命名空间,只要把本身全部的代码都写在这个特殊的函数包装内,那么外部就不能访问,除非你容许(变量前加上window,这样该函数或变量就成为全局)。各JavaScript库的代码也基本是这种组织形式。 常见形式: (function () { /* code */ } ()); !function () { /* code */ } (); ~function () { /* code */ } (); -function () { /* code */ } (); +function () { /* code */ } (); function(){ /* code */}();