易错面试题

(1)

var a =10;

    function test(){

        a = 100;

        console.log(a)

        console.log(this.a)

        var a;

        console.log(a)

    }

    test()

//作用域  this  变量提升

答案:100  10  100


(2)

    (function(){

        var a=b=3

    })()

    console.log(a)  //报错

    console.log(b)  //3

解析: var a=b=3    执行是的是  b=3;  var a=b

在函数内部没有找到3相当于在全局变量声明了一个b=3,因此console.log(b)为3

而var a在函数内部声明了,作用域在函数内部,因此在外面console.log(a)所以报错.



(3)

 for(var i = 1; i<=3;i++){

        setTimeout(function(){

           console.log(i) 

        },0)

    }

答案 :444

//  事件循环  等待队列 异步

解析:js是单线程语言,for是同步,在主线程,setTimeout是异步,要放在等待队列.主线程所有任务执行完毕后,在把等待里面的任务放在主线程里面执行.因此主线程for循环执行完毕后,i已经等于4,因此输出三个4,var在全局作用域

如果把var改成了let,则输出123.因为es5只有两种作用域:全局作用域和函数作用域,es6新增了块级作用域.for循环循环了3次,相当于产生了3个块级作用域,因此每一个i的值都是不一样




(4) 

function fun(n){

        console.log(n)  //123

        var n = 456

        console.log(n)  //456

    }

    var n =123

    fun(n)

答案:123  456

如果function fun()  则为und 和 456

作用域:先内部找,如果找不到,再向外部找

优先级:变量>普通函数>参数>提升



(5)

 function fun(){

        console.log(n)  //123

        n = 456  //前面没有var  没有变量提升

        console.log(n)  //456

    }

    var n =123

    fun()

答案:123  456

解析:第一个n在函数里面找,没找到,因此去外面找,所以是123,接着n=456,也在函数内部找n,给n赋值,也没找到,因此全局n赋值为456,因此下面的那个n也输出为456


(6)

  function fun(){

        console.log(n)  //und

        n = 456

        console.log(n)  //456

    }

    fun()

    var n =123

答案:und  456

(7)

    function fun(){

        console.log(fun)  //fn

        fun = 456

        console.log(fun)  //456

    }

    fun()

    var fun =123

答案:fn   456

解析:因为预解析函数优先级比var要高,因此fun = funcition fun,所以第一个答应的是fn

如果var fun =123放在最上面,fun还是会俾fun =123 先执行,因此最后fun(),会报错,因为这时候fun = 123,不是一个函数,调用不了


(8)

   var iNum = 0

        for(var i = 0;i<10;i++){

            if(i%5==0){

                continue

            }

            iNum++

        }

        console.log(iNum)

答案:8

解析:i=1,iNum=1,

i=2,iNum=2,

...

i=5,iNum=4

i=6,iNum=5

...

i=9的时候跳出循环,所以INum=8


(9)

<script>

    var a = 1

</script>

<script>

    var a

    var b = a / 0  //b==infinity

    if(b==b){

        console.log(b*2+'2'+4)

    }else{

        console.log(!b*2+'2'+4)

    }

</script>

答案:Infinity24

解析:因为a=1,1/0为正无穷大,即Infinity,Infinity==Infinity为true,

Infinity*2还是无穷大为Infinity,因此为Infinity24



(10)

答案:输出btn,因为是btn按钮执行的,因此this指向btn



(11)


18行实际上是新创建了一块新内存,实际上两块内存



(12)


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容