• JavaScript深入浅出-闭包


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    function (){
    var localVal=30;
    return localVal;
    }
    outer()
    ---
    function (){
    var localVal=30;
    return function(){
    return localVal;
    }
    }
    var func=outer();
    func();//30;
    ---
    for(var i=0;i<4;i++){
    setTimeout(function(){
    alert(i)// all are 4!
    },500)
    }
    ---
    for(var i=0;i<4;i++){
    (function(i){
    setTimeout(function(){
    alert(i)//随机1-4出现 因为异步的关系,但是并不是4
    },1000)
    })(i)
    }

    第一种当函数执行完毕后,垃圾回收机制会把局部变量给回收
    第二种就是闭包了,当函数执行完毕后返回一个函数,因为作用域链的关系
    window=>outer=>function()[匿名函数];

    实例分析

    闭包
    如图.

    全局初始化阶段

    1
    3
    4
    AO(global){
    add:<ref to func 'add'>,
    f:undefined,
    }

    全局执行阶段

    1
    AO(global)[f]= run func add

    add初始化阶段

    1
    2
    3
    AO(add){
    i:undefined,
    }

    add执行阶段

    1
    2
    AO(add)[i]=0;
    AO(add) return go to global and set global f

    全局执行阶段-1

    1
    2
    AO(global)[f]=anonymous function
    AO(global) f() run func 'f'

    f初始化阶段

    1
    2
    3
    AO(f){
    outer:add
    }

    f执行阶段

    1
    AO(f) alert(i++) // find to outer ... in func add

    在outer找到i

  • 相关阅读:
    mysql(一)
    spring
    数据库连接池
    spring jdbctemplate
    HDU-4219-Randomization?
    离线赛总结
    HDU-4507-吉哥系列故事-恨7不成妻
    HDU-1204-糖果大战
    [BZOJ1150][CTSC2007]数据备份
    二分图学习笔记
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12361039.html
Copyright © 2020-2023  润新知