美文网首页
面试题2

面试题2

作者: 幸宇 | 来源:发表于2018-03-11 16:41 被阅读2次

    有关前端面试中的运行题,变量的作用域

    1.外层的变量,内层阔以找到(全局),内层的变量,外层找不到(局部)
             var a=10;
             function aa(){
                 alert(a)
             }
             function bb(){
                 var a=20;
                 aa()
             }
             bb();// 10;
    
    2.当var 不加的时候,会自动生成全局变量(不建议这样写,最好把所有要定义的变量加上var)
            function aa(){
                a=10;    
            }
            aa();
            alert(a) //10
    
            function aa(){
                var a=b=10;
            }
            aa();
            alert(a)  //a is not defined;
            alert(b)  //10;
    
    3.变量的查找是就近原则去找var定义的变量,当就近没有找到的话,就会查找外层
            var a=10;
            function aa(){
                alert(a);//"undefined"  预解析,所以尽量在定义变量的时候尽量写在前面
                var a=20
            }
            aa()  
    

    改:

            var a=10;
            function aa(){
                var a=20
                alert(a);
                
            }
            aa()  //"20"
    

    再改:

            var a=10;
            function aa(){
                a=20
                alert(a);
                
            }
            aa()  //"20"
    

    再改:

            var a=10;
            function aa(){
                alert(a);
                a=20
                
            }
            aa()  //"10"
    

    再改:(变量作用域)

            var a=10;
            function aa(){
                bb();
                alert(a);
                function bb(){
                    var a=20;
                }
            }
            aa() //10 
    
    4.当参数跟局部变量重名的时候,优先级是等同的;
            var a=10;
            function aa(a){
                alert(a);
                var a=20;
            }
            aa(a);//10 
    
    5.对象和基本变量之间赋值的差别,对象涉及到地址引用的问题
            var a=5;
            var b=a;
            b+=3;
            alert(a)//5
    而对象:
            var a=[1,2,3];
            var b=a;
            b.push(4);
            alert(a)  //1,2,3,4
    解决就是给b重新赋值:
            var a=[1,2,3];
            var b=a;
            b=[1,2,3,4]
            alert(a) //1,2,3
    所以:
            var a=10;
            function aa(a){
                a+=3
            }
            aa(a)
            alert(a)  //10 从两个方便都可以解释,第一是从变量赋值的规则上,原来的a的值是不会变的,其次,在外面调用全局变量也只会找到a的值为10;
     所以:
            var a=[1,2,3]
            function aa(a){
                a.push(4)
            }
            aa(a)
            alert(a)//1,2,3,4  这里存在对象的地址引用的问题,所以a会是这样 
    
     所以,若是重新赋值则会不一样:
            var a=[1,2,3]
            function aa(a){
                a=[1,2,3,4]
            }
            aa(a)
            alert(a)//1,2,3  
    
    
    

    相关文章

      网友评论

          本文标题:面试题2

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