文档章节

对于毕包的理解

潇洒奶牛
 潇洒奶牛
发布于 2014/09/12 21:37
字数 736
阅读 15
收藏 0

毕包是一个比较抽象的开概念。对于我们这些新手来说,其中的一些特性是很难理解的。

    在理解它之前,我们应先弄清楚什么是作用域链。作用域链可理解为:在函数定义时创建的的一个索引,用来寻找函数中变量的值。它的规则:函数自身本地变量放在最前面,父级函数变量放在其次,祖父~~~~。当需要查找某个变量时,js解释器就现在自身函数里面查找,如果没查到,就在去父级函数里面查找,父级没有的话就去更外一层的函数查找,如果到最后都没有查找的就返回undefined;

    其次,我们还需要了解js的内存回收机制。一般情况下,函数开始执行的时候,会给其中的变量留一个空间用于保存它们,以备后面语句用。当函数结束的时候,变量就无用了,这个空间就回收了。当函数再次启动的时候就会重复刚刚的步骤。但是当这个函数中有另外一个内部函数时,那么这个函数若需要父级函数里面的变量的时候,就读取不到所需变量的值。所以在这个时候,js解释器就会形成一个“包包”将这个函数及父级函数里面的变量打包起来。不会被回收。此时的”包包“既是毕包。当内部函数被删除或者指针不在时,毕包也就被被销毁了。

作用域链:

    function boke(){
        var x=1;
        testtwo = function(){
            alert(x);
        }
        testtwo();
    }boke();//此时变量在父级函数里面 得到1.

       function boke(){
        var x=1;
        testtwo = function(){
            var x=2;
            alert(x);
        }
        testtwo();
    }boke();//此时已在本函数里找到变量 就到此为止了。且得到2;

    var x=1;
    function boke(){
        testtwo = function(){
            alert(x);
        }
        testtwo();
    }boke();//此时本函数,父级函数都没有就一直往上找。得到1;

    function boke(){
        testtwo = function(){
            alert(x);
        }
        testtwo();
    }boke();//此时本函数,父级函数都没有就一直往上找。返回undefined;

毕包:

    function exercise(){
        var z = 1;
        addinfo = function(){z*=2;}
        function exerciseone(){ alert(z+1); }
        return exerciseone;
    }
    var closure = exercise();
    addinfo();
    closure();//得到3

此时exercise函数里面就有内部函数exerciseone,所以此时js解释器就会生成一个毕包,将exercise中的变量及函数保存在毕包中。所以:
    function exercise(){
        var z = 1;
        addinfo = function(){z*=2;}
        function exerciseone(){ alert(z+1); }
        return exerciseone;
    }
    var closure = exercise();
    addinfo();
    addinfo();
    closure();//得到5.

当内部函数被删除或者指针不在了,毕包也及相应的被销毁了。

    function exercise(){
        var z = 1;
        addinfo = function(){z*=2;}
        function exerciseone(){ alert(z+1); }
        return exerciseone;
    }
    var closure = exercise();
    closure();得到2;

综上所述,毕包有两个优点:①读取函数内部变量;②让函数内部变量的值一直保存(内存中)。


© 著作权归作者所有

潇洒奶牛
粉丝 6
博文 8
码字总数 6269
作品 0
成都
私信 提问
?为什么要学这个技术(有什么优秀的地方,可以解决哪些问题?

今天来总结一下Struts2的知识点,学习编程我的思路一般是这样的:     ① why ?为什么要学这个技术(有什么优秀的地方,可以解决哪些问题?)。     ②what ? 这个技术是什么玩意?有...

SEOwhywhy
05/26
0
0
八招提升你的 R 语言编程能力

引言 这个世界每天都在源源不断地生产数据,而人们尤其是商界往往希望从这些数据中获取到有价值的信息。而这一点也促使很多试图从数据中提取有用信息的数据科学家们(或被叫做数据分析师、数...

Datartisan
2017/07/06
0
0
主成分分析(PCA)中的误差表示

给定n个m维样本X(1), X(2),…,X(n),假设我们的目标是将这n个样本从m维降低到k维,并且尽可能保证这种降维的操作不会产生很大的代价(重要信息的丢失)。换句话说,我们要把n个样本点从m维空...

JiaMing
2015/03/17
0
0
每天阅读一个 npm 模块(5)- ee-first

系列文章: 每天阅读一个 npm 模块(1)- username 每天阅读一个 npm 模块(2)- mem 每天阅读一个 npm 模块(3)- mimic-fn 每天阅读一个 npm 模块(4)- throttle-debounce 一句话介绍 今天...

elvinnn
2018/09/04
0
0
毕啸南专栏 | 对话百度王海峰:AI时代会产生新巨头

作者简介:毕啸南,知名青年学者,量子位专栏作家,《中国AI领袖人物访谈》系列制片人、主持人。点击文末阅读原文,关注量子学园的毕啸南专栏,跟随他一起持续深度对话李开复、周鸿祎、王小川...

yh0vlde8vg8ep9vge
2017/12/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Mac部分目录读写提示“Operation not permitted”解决

今天试图在mac os x下重命名/usr/bin/python,提示Operation not permitted,虽然我是root,很奇怪。原来mac os x里还有一个安全机制:rootless,少用root。参考这篇文章如何开关rootless,不...

swingcoder
34分钟前
2
0
49.Nginx防盗链 访问控制 解析php相关 代理服务器

12.13 Nginx防盗链 12.14 Nginx访问控制 12.15 Nginx解析php相关配置(502的问题) 12.16 Nginx代理 扩展 502问题汇总 http://ask.apelearn.com/question/9109 location优先级 http://blog....

oschina130111
40分钟前
4
0
信必优成功案例 – 中国网络电视台(CNTV)

项目背景 •中国网络电视台(英文简称CNTV),由央视国际网络有限公司主办,是中央电视台旗下的国家网络广播电视播出机构。中国网络电视台全面部署多终端业务架构,已建设网络电视、IP电视、...

symbiochina88
40分钟前
6
0
redis cluster集群 三主三从

redis 集群一般由 多个节点 组成,节点数量至少为 6 个,才能保证组成 完整高可用 的集群。每个节点需要 开启配置 cluster-enabled yes,让 redis 运行在 集群模式 下。 redis5之后使用redis...

MonroeCode
42分钟前
1
0
新东方的Kubernetes实践:从服务化ES到Kafka和Redis

2017年,新东方开始了利用容器化手段将中间件业务服务化的探索,基于Rancher 1.6使用ES;2019年,新东方再次开始了扩大了中间件的业务服务化,基于Kubernetes使用Kafka、ES和Redis。在服务化...

RancherLabs
43分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部