码迷,mamicode.com
首页 > 其他好文 > 详细

培训课题目记录2

时间:2016-02-22 22:12:11      阅读:271      评论:0      收藏:0      [点我收藏+]

标签:

这题貌似分了两种情况。
情况一、先放源码:技术分享
最开始的第一二行分别对f,g进行函数的创建。然后当程序读到红框部分的自调函数时,二话不说就直接执行里面的内容。接下来研究一下红框部分:
                        if的条件中有3个值被用来进行关系逻辑运算,从左到右分别是:1、g()的返回值  2、[ ]的布尔值 3、![ ]的布尔值 
                        g() 的返回值好说,很明显是false。[ ]的布尔值为true。为什么? 按理说,[ ] 本身是一个数组对象,它又不是布尔类型的值,怎么能用来进行逻辑运算?进行逻辑运算的时候,默认会先把逻辑运算符(这里是&&)左右两边的值先隐式转换成布尔类型的值,再做逻辑运算。因此  g()&&[ ] 相当于是: false && Boolean([ ]);Boolean([ ])结果为true,所以有:false && true==》false。既然[ ]取布尔值为true取真,那![ ]当然是false取假咯。  所以if的括号里面的条件其实是这样子:(false && true)== false  一目了然,== 两边相比结果为真,if条件满足,进入if的执行体。

在执行体里面,有两句话被执行了:var f = function(){return false;}以及function g( ){ return true;}。前者以函数直接量的方式创建一个函数f,后者则声明了一个函数g。至此,又有两个新的函数对象生成是毫无疑问的,问题在于,红框内新出现的一组 f 和 g 和红框外面的是不是同一个东西?会不会有冲突?——这里如果你的判断时间超过2秒那我只能说:少侠你还不给力。明显不是,一组在内,另一组在外,红框内的所有内容将会在整个匿名函数调用完之后被丢弃掉。换句话讲,红框内的f 和 g 两个函数刚被创建出来,连调用都没被掉用过就被丢弃了——整个红框的调用于此时此刻显得毫无意义。
=========================================================================================================
既然如此程序执行完①这一行控制台会输出什么实在太明显了。

执行到②这里相当于是让之前声明过的 f 指向一个新的函数,就结果而言 f 所存放的值被替换了。
(如果还不太明白请去看看有关声明提前的内容。虽然跟这题没多大关系但还是顺便提醒一下,函数的声明提前和变量的声明提前规则不太一样,只有用:function fun(){...}——声明方式创建的函数,其名字才能被提前,用var fun =function(){...} 这种函数直接量方式的不行)

程序执行到③,调用 f 函数,当中的a因为是使用var在AO内部声明的,所以将会随函数的调用完毕和AO一同被丢弃。至于b,还是那句,之前都没有遇到过关于b的var声明,所以window下直接创建一个b并让其等于1 。③执行完毕后就结果而言,只有b留了下来。所以最后输出一个报错一个为1。

========================================================================================================
情况二、把源码改一下变成这样子:
技术分享
前面的内容都一样就不说了,只从setTimeout那部分开始,因为涉及到执行环境栈(ECS)这个本人不太熟悉的东西,所以我把老师给的注释留了下来以我的见解作解释,这里希望有人可以帮我看下我的观点是否正确。
            setTimeout定时器要求要等到主程序的执行都执行完才执行,那到哪里才叫“主程序都执行完”?我认为是直到整个程序最后结束,即ECS不会再有新的对象入栈。如果说每一条js执行语句代表着一个进入ECS的对象,那也只有程序读到没东西可读了才能保证执行环境栈中不会再有新的内容。只有在这种时候定时器里的函数才开始被调用。换句话讲,在这个例子当中,只有等到图中setTimeout之前,以及setTimeout之后的所有语句都执行完了之后,定时器当中的 f 才被调用。又因为 f 只要一天没被调用,就永远不会有变量a和b的出现,
所以最后的console.log(b)和console.log(a) 当然都只能报错了。
为了验证以上说法的部分正确性我把源代码后面的这部分作了下修改:
技术分享
下面是执行结果:
 技术分享
一目了然。

                           

-------------------------本文由博主原创并保留追责权利,如需转载请邮箱联系博主征得同意,并注明转载出处 博主邮箱:523893659@qq.com转载请注明出处,欢迎高手一起探讨----------------------------

培训课题目记录2

标签:

原文地址:http://www.cnblogs.com/strike2warfare/p/5208124.html

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