闭包的原理,及工作运用环境。

@1 了解闭包之前,首先来看一下立即执行函数。
        立即执行函数的特点:1 不会在所处上下文【宿主环境】中进行声明,设置的名字在外面用
        不了。2 在自己执行上下文中被声明赋值,赋的值是当前函数本身。3 而且赋的值不能被修
        改,如果名字被其他方式声明了var/let/const,则以其他方式声明的为主。

         案例如下:

闭包的原理,及工作运用环境。_第1张图片
 

闭包的原理,及工作运用环境。_第2张图片分析如上代码执行的逻辑:
                
第一道题: var fn = 20声明在了全局变量中,可以被立即执行函数所访问,同时也能被
                全局访问。   立即执行函数内部如果访问的是立即执行函数的函数名,则返回的是函数
               本身。
                第二道题:  var fn = 20声明在了全局变量中,可以被立即执行函数所访问,同时也能被
                全局访问。  立即执行函数内部属于私有作用域,存在变量提升的问题 var fn; 本身fn应
                该是函数本身,但是被var fn又重新声明了,所以结果是undefiend; 函数内部存在私有
                作用域,所以外部无法访问函数体内部声明的变量,所以结果是20。
@2 递归函数的使用:
        1 死递归: 
         ( function fn () {
                 fn() // 返回的是函数本身 又立即调用函数 所以形成了死循环
                })() 
        2 根据条件进行判断 退出死循环;
             let num = 0;
             (function fn() {
                if (num > 4) return  // 判断条件 当不符合条件的时候就会停止执行
                num++
                fn ( )   // arguments.callee() 调用的也是函数本身 严格模式下不允许
              } )()                                                                                                                                  @3 利用一道面试题目来了解下浏览器的回收机制:
        浏览器垃圾回收机制:分为堆内存和栈内存两块空间。
        堆内存:主要是看当前堆内存的空间的地址,是否还被别的东西所占用, 如果被占用,则不
        能释放,如果没有占用,浏览器会在空闲的时候所释放。也可以手动释放,把当前执行的函
        数设置为null。
        栈内存:打开页面的时候形成,关闭页面的时候释放。 函数/块级私有上下文,正常情况下代
        码执行完,产生的私有上下文会被释放,特殊情况,如果上下文中创建的某个东西(一般指
        函数)被上下文以外的占用,不能被释放,而且当前这个私有的上下文也不能被释放。
        接下来看下面代码的执行过程:
闭包的原理,及工作运用环境。_第3张图片
        简单分析下代码的执行过程:
        1 全局变量的let x = 5 ;是基本数据类型所以存放在栈里面,同时属于全局的属性。
        2 const fn这个方法属于函数,所以存放在堆内存中。
        3 let f = fn(6) // 最终执行的结果就是fn(6)这个函数的返回值也就是 function(y){conole.log{y++
           (x)}}这个函数。
        4 f(7) // 这个函数的执行相当于是fn(6)(7)。因为f这个函数的x后期一直会被占用,所以x不会
           被释放。 如果想要释放的话, f = null 。
        5 fn(8)(9)与f赋值的函数不相关。 所以fn(8)(9) //相当于 let f = fn(8) f(9)这样执行;但不同点的
           是fn(8)(9)执行完会被释放 。 
        6 f(10) // 执行的结果因为之前有f(7)函数变量x的不会被释放。
        

        
        
         

你可能感兴趣的:(javascript,开发语言,ecmascript)