JS闭包

1.闭包

闭包(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 */}();
相关文章
相关标签/搜索