美文网首页前端码无界前端前端
前端基础进阶(六):在chrome开发者工具中观察函数调用栈、作

前端基础进阶(六):在chrome开发者工具中观察函数调用栈、作

作者: 这波能反杀 | 来源:发表于2017-02-19 21:26 被阅读16051次

    由于某些原因,文章已经删除,打算迁移到别处,目前正在寻找更合适的平台。

    请大家关注我的新公众号ar_indus,随后我会在公众号里推送新的博客地址。

    后续计划的《react进阶系列》文章也会在新公众号中推送。

    公众号二维码

    ar_indus

    相关文章

      网友评论

      • fe99f404b764:配图是碧螺塔吗?
      • 不净莲华:个人理解,闭包就是在函数外部调用函数内部的函数,本来函数外部是无权访问函数内部的函数或者变量,但是通过外部变量引用或者返回函数方式使得函数能够在外部调用,在调用时执行上下文创建和执行过程中保留了变量对象和作用域链使其不会被垃圾回收的过程就是闭包
      • ishowman:国内可以转到掘金或segmentfault,简书现在就是个鸡汤文聚集地,确实不适合写技术文章了
      • 2aa405c6cb40:var fn;
        var m = 20;
        function foo() {
        var a = 2;
        function baz(a) {
        console.log(a);
        }
        fn = baz;
        }
        function bar() {
        fn(m);
        }

        foo();
        bar(); // 20

        请问这样写是不是有误导别人的感觉,因为你在baz(a)这里传的a,而后面你又打印了a,后面打印的a到底是上个函数的a还是穿的参数?如果我把baz(obj)传参obj,在fn(m)传入m,那么最后打印a依然是2啊,并不是20
        75c4fe8609a0:你是多蠢啊
      • 李天迪装修美缝经历:学习了,希望可以与你互动~
      • czl_zy:看了以后感觉还是很懵逼,只能一遍一遍的慢慢啃。感谢作者分享
      • 一个庸俗的神:闭包的概念不应该是🙃 函数内能访问到函数外的变量的集合与该函数本身🙂 然后它们一起愉快地构成一个闭包嘛…不光js,其他语言闭包的概念也是酱紫的吧🤔🤔
        狂澜1991:@虎伢不是芽儿 所以,不论内部函数有没有访问外部函数的成员变量,只要函数嵌套了函数,就形成了闭包对吗?
        虎伢不是芽儿: @一个庸俗的神 我也这么认为,闭包就是来对抗垃圾回收的😂而且根据大佬前几篇文章所说:一个函数之所以有权访问其他函数的私有变量,就是因为[[scope]]中保存着其他函数活动对象的索引。所以无论他访问不访问,他都有这个权利,所以就形成了闭包。我认为chrome中只是不访问的时候就不显示闭包而已,并不是没有闭包存在…并不能用一个浏览器的实现来定义闭包,浏览器多是不靠谱的,而且我们看到的只是效果……大佬这篇文章不严谨哈哈😝
        一个庸俗的神: @一个庸俗的神 chrome浏览器控制台就把这句话解释的很清楚…所以为什么非得把闭包当成一个块来理解,他喵的好不容易能访问到的那个外面的变量就这么吃了?☹所以最后那个例子会理解不了…构成闭包的是foo中的变量a与函数fn,跟下面的fn2一点关系都没有哦🙂不是特例呢😗
      • wlszouc:书中的闭包概念是对的,chrome的调试信息也没错。一个函数的变量对象中含有来自其他变量对象的变量,即为闭包。而chrome给出的是这个变量来自哪一个变量对象。
      • AdreamZ:高程说闭包是 "有权访问另一个函数作用域中的变量的函数" ,但只要是函数内部的函数都可访问外部函数的变量,却不是闭包。还需要将内层函数在外部调用,引用这个变量,才会形成闭包。这个定义是不是太敷衍了。
      • allen151:<span style="color:red;">不知道</span>行不行。
      • c4283822cacf:大佬威武! 通读了一遍收获很大 基本把思路理清了
        关于最后一个例子...
        // demo07
        高程里对闭包的解释是 "有权访问另一个函数作用域中的变量的函数"
        就是说fn1是闭包
        但根据楼主的实验 在chrome中, 有fn1是闭包 没fn1不是闭包
        由此推测..
        chrome对闭包的解释可能是
        包含 "有权访问另一个函数作用域中的变量的函数" 的函数
        就是在高程的闭包解释基础上又在外面包了一层...


        我在想
        有没有可能是chrome指的closure其实是指当前闭包使用到的变量和所在的函数....

        个人愚见 = =
        轻喷
      • 55c59afe8674:最后一个例子我的理解是这样的,
        浏览器会检测一个执行上下文中是否有引用了内部变量的函数,如果有的话,那么就会有将该执行上下文的函数就被认为是一个闭包;所以执行fn2时会foo会出现在闭包里,一旦去除fn1就没有foo闭包,说明fn1的引用内部变量的行为已经使foo被认定为闭包。
        那么闭包应该是被调用执行的时候,通过识别是否内部有引用内部变量的函数来确定创建的。
      • demo11:闭包,用在哪些方面呢?我的实践中,好像是只有在for循环给元素绑定事件的时候用到?
      • 9848c5eb3f81:看了前六篇,写一下我对闭包归属的理解。
        1、闭包是在函数被调用执行的时候才被确认创建的
        2、只有内部函数访问了上层作用域链中的变量对象时,才会形成闭包
        |- 基于这两个闭包的基本特性,我认为闭包并不单单指作用域链上的某个函数,而是被调用函数及其扩展。闭包的主体或主导者是被实际调用的那个函数,保存的上层变量对象就是其扩展。
        |- 在Chrome里面显示的【Closure(foo)】中,foo应该指的是当前闭包中的变量是属于foo函数对应的变量对象
      • 爱思考的蛋:从某公众号上看到波波老师,不过上面的有部分错误,所以顺着路找到简书来了,向你学习~~
      • df9287d6e1ff:①闭包是个函数。
        ②闭包是以结果导向的,最终结果的输出,过程中所涉及到的引用变量的函数。eg·demo7中fn2根本就不是闭包。他没有访问变量a。
      • 别过经年:你不知道的JavaScript,44页面,上面的说法
        ···
        function foo() {
        var a = 2;

        function bar() {
        console.log( a ); // 2
        }

        bar();
        }

        foo();
        ···
        闭包的定义:
        **当函数可以记住并访问所在的词法作用域时, 就产生了闭包, 即使函数是在当前词法作用域之外执行。**
        这是闭包吗?
        技术上来讲, 也许是。 但根据前面的定义, 确切地说并不是。 我认为最准确地用来解释
        bar() 对 a 的引用的方法是词法作用域的查找规则, 而这些规则只是闭包的一部分。( 但却
        是非常重要的一部分! )

        chrome打断点确实是closure。
        波同学作何解释?
        谁抢了我的麋鹿: @别过经年 我也觉得这个解释是最能让我肯定的
      • 浩风起兮:看是看懂了,感觉自己不会想到用,除非刻意去用,用得最多的还是for循环的i,往后看看,估计很多情况自己用了也没意识到:smiley:
        这波能反杀:@浩风起兮 可以有意识的多用用
      • f9ef3e0fec69:波老师,你写的文章真的很棒,拯救了对js迷茫的我,谢谢你啦
        这波能反杀:@蓝天很常见 不客气:stuck_out_tongue_winking_eye:
      • jia58960:书中自有黄金屋,书中自有颜如玉:smile:
      • 流曲无觞:既然闭包是在内层函数调用的时候才确定,那闭包怎么阻止外层函数运行完后的垃圾回收?还有闭包那一章节你说是由于引用的关系导致外层函数的变量对象被保存下来了,那如果我内层函数没用使用外层函数的变量,那这个变量怎么回收,麻烦解答下,有点不理解
      • a9cd41014655:波大神,我的chrome浏览器一个断点怎么调试不了,要多个才能调试
      • 越夜鸣:666 快能签约了,刚芭蕾! 前端做项目,来补课了(´∀`*)
        这波能反杀:@越夜鸣 :clap: 加油
      • c1c38f6f74eb:浏览器控制台的Closure (foo)会不会表示的意思是通过闭包访问到foo的作用域,而不代表foo就是闭包呢
        5a659a6b42e3:个人理解,他们两个是个整体,不是某个函数叫做闭包。而且内部有时会用到匿名函数,把foo叫做闭包方便说明。
      • 29f26f9f36ce:看了波波老师的文章,有种相见恨晚的感觉,自学前端有近一年了,最近要开始找实习了,跟着复习一遍,大有裨益
      • 2bfeaae81a73:虽然旁边能看到闭包,但是当前执行环境使用不了
      • chenpipy:假如有ABC三层嵌套函数,如果C访问A中的变量,也是闭包吗,一直以为只有两层嵌套才算闭包
      • liangFung:1.没有用到外层的变量却形成了闭包,确实不解。。。
        2.文章截图详细,用心了~
        3.在我看来,其实chrome的理解和两本书中的理解都是一个道理,只是以chrome的显示方法可以让人更加直观的看出来形成闭包之后,哪个变量对象被保存下来而没有被垃圾回收。A(变量对象)和B(内部函数)共同组成了闭包,你说A是闭包或者B是闭包都没啥问题。
        4.那为什么书中会以内部函数作为描述闭包的“点”呢,是因为A里面有B,也有C,D,E,但是只有B和A组成了闭包,那用B作为标识的点也可能更加的准确一点了。一个是让调试的人看得直观,一个是让学习的人认得准确(当然,上面说的第一点是不理解了。。。也有可能是Chrome的一个小bug)
        56322fe44873:我个人观点,因为其他方法还是test里面的东西,test是一个整体,假设我引用sum方法,先执行_mask方法,如果浏览器不是把这个形成闭包,当我在后面调用tets.sum应该会抛出错误.所以应该是把整个test在语法编译解析的时候就确定防止这种错误发生???个人观点,不知道对不对.
        这波能反杀:@liangFung 你说的第一点,大概是一种预留情况下的处理吧,这和chrome的实现有关。
      • 5c7650875e94:发现一些小错误,感觉读着会有点不好理解。
        1.在断点调试界面图下面第二行“在最左侧上方,有一排图标。”这里应该是“最右侧上方。”

        2.在描述那几个图标说明的下面几个段落里的左侧应该都是右侧。

        3.调试代码里的 demo05 里的示例源码倒数第二行,这里应该是 var _mark = test.mark; 否则按照示例运行,最后会报错。

        最后,感谢分享。
        df9287d6e1ff:@wandertheworld 我也觉得没这耐心写这么详细
        5c7650875e94:@波同学 :blush: 不客气。写这么优质的文章超费精力的,谢谢你的分享。
        这波能反杀:感谢指正:pray:
      • 128f587d6ed6:demo05
        如果去掉add和sum 属性
        (function() {

        var a = 10;
        var b = 20;

        var test = {
        m: 20,
        mark: function(k, j) {
        return k + j;
        }
        }

        window.test = test;

        })();

        var _mark = test.mark;
        _mark();
        运行到 return k + j; 并没有形成闭包,波老师,怎么回事呢。
        这波能反杀:@我要成为你 这是很多人都发现了的一个情况,暂时我也没找到一个好的解释来说明这个问题,先当成一个特殊情况记着吧
        128f587d6ed6:@波同学 加上add和sum,但没有执行add和sum
        (function() {

        var a = 10;
        var b = 20;

        var test = {
        m: 20,
        add: function(x) {
        return a + x;
        },
        sum: function() {
        return a + b + this.m;
        },
        mark: function(k, j) {
        return k + j;
        }
        }

        window.test = test;

        })();


        var _mark = test.mark;
        _mark();
        运行到 return k + j; 就形成了闭包, mark不也是没有访问上层作用域的变量吗?
        这波能反杀:@我要成为你 没有访问上层作用域的变量
      • 悟小僧:function pp() {

        var a = 10;
        var b = 20;

        function add(x) {
        return a + x;
        }
        function mark() {
        return 2;
        }

        mark();
        add(2);

        }
        pp();
        这样有闭包

        function pp() {

        var a = 10;
        var b = 20;

        // function add(x) {
        // return a + x;
        // }
        function mark() {
        return 2;
        }

        mark();
        // add(2);

        }
        pp();
        这样就没有,这是什么毛病
        df9287d6e1ff:@夏目家的喵_2333 我也觉的是这样,闭包跟全局变量是否被引用到关系很大。问题回到,全局变量跟最终输出,直接可以影响到谁是闭包,或者换种说法,涉及到全局变量引用的函数不管多少层都可以归为闭包。
        悟小僧:mark都没有访问私有变量,按道理都不具备闭包条件。但是如果函数中有存在闭包,其它函数都会变成闭包:disappointed_relieved:
      • gaspar_507f:闭包带来了这样一种可能:扩大闭包内局部变量的生命周期,但又不扩大它的作用域。让我们除了全局变量和局部变量外,还可以拥有第三种变量:闭包变量:blush: :smile:
      • 56e26a4f693b:一个想法,不一定对。其实chrome和书都没错。
        下面是MDN的:
        A closure is the combination of a function and the lexical environment within which that function was declared. This environment consists of any local variables that were in-scope at the time that the closure was created.
        闭包是一种特殊的对象。它由两部分构成:函数,以及创建该函数的环境。环境由闭包创建时在作用域中的任何局部变量组成。

        chrome的scope选项里面还有local和global。closure这个选项是指闭包创建时的作用域,closure选项展开显示的是这个作用域里面的变量。
        这波能反杀:MDN的意思是闭包是函数以及在该函数的词法作用域中声明函数的一个组合。所以chrome里指定改函数为closure应该也说得通
      • JohnsonChe:看了两篇波同学的总结,质量很高,不打赏觉得都对不起自己看的:smile:
      • 别过经年:demo3 断点打到var b = 9;的时候也有closure形成,这个作何解释?
        这波能反杀:暂时能给出一个稍微合理的解释就是这和a有关,去掉
        return function fn() {
        console.log(a);
        }
        就没有办法形成闭包了,目前已经发现了好几个类似的例子。具体规则还不清楚是什么
      • 我就不信这个昵称也不合法:先赞,看了前面,后面的慢慢看
      • e07dc37f4378:看了波老师的文章很受启发,我想了想,闭包可以这样定义:当一个函数内申明的子函数,调用了该函数内的变量对象,且在该函数作用域外被引用,那么该函数就形成了闭包。
        e07dc37f4378: @波同学 模块内调fn2
        e07dc37f4378: @波同学 子函数确实不用被该函数作用域外引用,不过被调用的子函数也不用访问了上层作用域的变量,只需要该函数中申明的子函数中有一个子函数调用了该函数的变量对象。
        例如:
        (function()
        var a=1;
        function fn1(){
        return a;
        }

        function fn2(){
        return 2;
        }
        )()
        这波能反杀:嗯,在chrome里,在该函数内部调用声明的子函数,也是能形成闭包的,判断的唯一标准是子函数在被调用时,是否访问了上层函数的变量。比如这个例子,fn也是闭包。

        function fn() {
        var a = 20;

        function bar() {
        return a;
        }

        bar();
        }

        fn();
      • e07dc37f4378:还是有些疑问,当test中没有add和sum属性,为何就没有闭包了😂,求解
      • Oldboyyyy:// demo02
        var fn;
        var m = 20;
        function foo() {
        var a = 2;
        function baz(a) {
        console.log(a);
        }
        fn = baz;
        }
        function bar() {
        fn(m);
        }

        foo();
        bar(); // 20
        demo2,baz没有直接用到foo的参数,但是在他的作用域链上面应该也保存有foo的变量对象吧,那foo执行结束他的变量对象应该也不会销毁吧,这样我感觉也是是闭包吧?求波老师指点一下:blush:
      • 墨雪_2705:写的真好,继续关注!
      • _panda:可以转载一下,转到自己的私人博客。会留链接的和表示是转载的。好文章想分享一下
        这波能反杀:@_panda 不好意思,请勿转载
      • 坤少卡卡:赞完mark,今天太晚明天看,哈哈
      • ebf9d606d329:由浅入深讲的灰常棒,懵懂的我也懂了不少了
        这波能反杀:学到东西就好:smile:
      • kerush:这逗比的闭包是要逆天吗,至于这么扑朔迷离吗,我表示已经看晕了
        这波能反杀:一个例子一个例子慢慢尝试,就明白了
      • d940889db9ad:demo5中----mark执行时,闭包为外层的自执行函数,this指向test

        mark并没有访问上层作用域链的变量吧,应该不算闭包。

        所以应该是---mark执行时,没有形成闭包,this指向test?
        这波能反杀:@一别经年8899 this的指向与作用域链是没有关系的
        别过经年:立即执行函数加个名字就看得到了,_mark中的this是window对象,何以见得_mark访问了test?
        这波能反杀:_mark方法访问了test,所以也是形成闭包的,可以在chrome浏览器中运行看一看
      • e867a635c8f2:膜拜大佬
        这波能反杀:会用了你也是大佬:joy:
      • 与我常在Jerry:demo1中在foo函数最后直接执行baz();也算是闭包?我刚才在chrome中试了一下,有一个closure,即a:2
        这波能反杀:对,也算,我现在都以chrome中的为准了,其他书上说的我就直接认为他们是错的
      • 77d555eb8d43:学习了,谢谢。F12以后打断点再F11就是跨入,方便一些,关于this指向,又有点迷糊,要回去重看第五章了,<你不知道的js>PDF下载了还没看,传说是本神书
        77d555eb8d43:@波同学 恩 期待你出更多的文章
        这波能反杀:嗯,熟练了可以直接用快捷键
      • liril:第一个图的箭头是在右侧吧,文章中是不是描述反了?:smiley:
        这波能反杀:@liril :joy:好像是整反了
      • kerush:keep fighting🚀
      • 02af926141e8:虽然看不懂 可我还是要赞
        这波能反杀:@嘉简_ :stuck_out_tongue: 谢谢,好感动
      • 无戒:看不懂。😂
        这波能反杀:@无戒 :joy::joy:术业有专攻
      • 014d5acab287:学习了,很有用,波波老师我有预感跟着你学习我要变成高手了,学得好扎实,来简书只关注你:joy:
        这波能反杀::joy: 一起进步
      • A1SoloturboYY:一楼
        这波能反杀:@A1SoloturboYY :pray:
        A1SoloturboYY:@波同学 因为刚才在看你的其他篇:grin:,不错不错
        这波能反杀:@A1SoloturboYY 厉害了,刚发出来

      本文标题:前端基础进阶(六):在chrome开发者工具中观察函数调用栈、作

      本文链接:https://www.haomeiwen.com/subject/lcarwttx.html