码迷,mamicode.com
首页 > 编程语言 > 详细

聊聊JavaScript-闭包

时间:2018-03-03 23:30:02      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:并且   font   技术分享   obj   报错   .com   div   ack   javascrip   

  今天聊聊闭包,网上五花八门的定义和解释很多很多,是不是搞得你很懵逼;每次看闭包,都不同,本来自己懂,看完别人的之后就开始怀疑自己了。在我看来,闭包简单的说就是函数里面套函数,再往大了说就是我函数外面想知道你函数里面的变量。怎么知道?我在你函数内部再写个函数2,把我想要得到的值获取到函数2中;然后我在函数外面在获取函数2中的值,完事,函数2就成了闭包。废话多了,直接开讲

要理解闭包,首先要知道js特殊变量和作用域

1、变量的作用域

变量的作用域有什么?局部变量、全局变量

js的特殊之处就是函数内部可以获取全局变量,

var a = ‘shizhikai‘;
function  func(){
    console.log(a)
}
func() ;//控制台打印  shizhikai

 技术分享图片 

而外部是无法获取函数内的局部变量 

function  func(){
    var a = ‘shizhikai‘
}
func(); console.log(a) //报错:a is not defined  

技术分享图片

这里注意一点是,如果函数内部变量不用var声明,那实际上就声明了个全局变量

 

function  func(){
    a = ‘shizhikai‘;
}
func();
console.log(a) ;

 

 技术分享图片 

2、怎么获取func函数内部的局部变量?

就是我刚才上面说的,在函数内部在套一个函数2,函数2获取func中的局部变量

function  func(){
            var a = ‘shizhikai‘;
            function func2(){
                console.log(a)
            }
            return func2;
        }
        var b = func()
        b() ;

  技术分享图片

看到了,我们外部获取到了函数内部的局部变量了

3、什么是闭包?

上面那个func2就是一个闭包。

咳咳,这下好好定义一下:闭包就是能够读取其他函数内部变量的函数

4、闭包的应用

 

? 应用闭包的主要场合是:设计私有的方法和变量。
任何在函数中定义的变量,都可以认为是私有变量,因为不能在函数外部访问这些变量。私有变量包括函数的参数、局部变量和函数内定义的其他函数。

匿名函数最大的用途是创建闭包,并且还可以构建命名空间,以减少全局变量的使用。从而使用闭包模块化代码,减少全局变量的污染。

var objEvent = objEvent || {};
(function(){ 
    var addEvent = function(){ 
     
    };
    function removeEvent(){
      
    }

    objEvent.addEvent = addEvent;
    objEvent.removeEvent = removeEvent;
})();

  在这段代码中函数 addEvent 和 removeEvent 都是局部变量,但我们可以通过全局变量 objEvent 使用它,这就大大减少了全局变量的使用,增强了网页的安全性。

5、闭包的缺陷

? 闭包的缺点就是常驻内存会增大内存使用量,并且使用不当很容易造成内存泄露。
? 如果不是因为某些特殊任务而需要闭包,在没有必要的情况下,在其它函数中创建函数是不明智的,因为闭包对脚本性能具有负面影响,包括处理速度和内存消耗。

 

聊聊JavaScript-闭包

标签:并且   font   技术分享   obj   报错   .com   div   ack   javascrip   

原文地址:https://www.cnblogs.com/shizk/p/8503255.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!