我爱编程

Javascript 学习(闭包)

2018-04-13  本文已影响0人  Cats_eat_fish

js闭包

js中的闭包问题是由函数变量的作用域引出的,全局变量和局部变量的概念和Java感觉没有太大的区别,但是如果要在js中实现Java中的私有变量效果,就引出了js闭包。

全局变量

在js中全局变量是指在function外部声明的变量,或者在function内部没有通过var声明的变量;
全局变量的生命周期是全局性的,即:在整个js文件中都可以调用。

例如:
var a = 0;//全局变量
function myfunction(){
    b = 0;//全局变量
    //这里可以访问a;
    return a + b;
}

局部变量

在js中局部变量是指在function内部通过var生命的变量;
局部变量的生命周期是局部性的,也就是只有在其声明的function中才可以调用。

例如:
var a = 0;//全局变量
function myfunction(){
    var b = 0;//局部变量
    //这里可以访问a
    return a + b;
}
//但是在myfunction()外部不能访问b

私有化需求

现在好多地方都会有计数器的需求;
通常我们可以通过定义全局变量的方式来实现;

例如:
var count = 0;
funtion add(){
    retutn ++count;
}

这样看着是实现了我们想要的功能,但是这样的话count变量是一个全局变量,所有的function都可以访问这个变量,不安全;
但是局部变量又不能满足我们的需求;

例如:
function add(){
    var count = 0;
    return ++count;
}

这样每次的返回结果都是1,不是我们想要的;
在js中每个function都可以访问他上一层声明的变量,

例如:
function func1(){
    var a = 0;
    var b = function (){
        //这里可以访问变量a
        return a++;
    }
    //这里调用b() 变量a会增加1;
    b();
}

这样把上边的方法简单修改就可以了

例如:
var b = (function (){//function A
    var count = 0;
    return function(){//function B
        return ++count;
    }
})();
//每次调用b()count就会增加1后返回
var c = b();

这样最后变的()意思为调用了functionA,即:b依赖的不是functionA 而是functionA的返回值function B,
在需要的地方直接调用b()就可以了
这样count就变成了只有b()能访问到的私有变量了,这就是js中的闭包。

上一篇下一篇

猜你喜欢

热点阅读