面试题2

2018-03-11  本文已影响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  


上一篇下一篇

猜你喜欢

热点阅读