zoukankan      html  css  js  c++  java
  • 一些js小题(一)

    一些js小题,掌握这些对于一些常见的面试、笔试题应该很有帮助:

            var a=10;
    	function aa(){
    		alert(a);
    	}
    	function bb(){	
    		aa();
    	}
    	bb();//10   因为bb函数调用aa时,程序在执行aa,执行aa时只能找到全局中的a:10


    当函数中声明变量不加var时则为全局变量:

    function test(){
    	var a=b=10;
    }
    test();  //切记:一定要执行
    alert(b);//全局  10
    alert(a);//报错,因为定义在函数内部,有var,属于函数内的变量,外部无法访问
    


    优先使用内部的变量,没有再往上查找,直到找到window,若还没有则出错,说明变量没有声明,如下:

            var a=10;
    	function aa(){
    		var a=20;
    		alert(a);
    	}
    	aa();//20  优先使用自身定义的var a=20,而不用再往上搜索全局

    但倘若把var a=20;放到alert(a);之后,则会undefined,例如下面代码:

            var a=10;
    	function aa(){
    		
    		alert(a);
    		var a=20;//放在了alert(a);之后
    	}
    	aa();  //undefined

    这个问题之前也让我百思不得其解,现在我终于懂了,函数在读取变量时有个“预加载”特性。之所以弹出undefined很明显是没找到,为什么没找到呢?原来是函数执行时已经知道函数内部已经定义了var a;了,这时就不会再往上查找全局(把后路堵死了),但当执行到alert(a);时 还有没执行到var a=20;也就是说此时的a还没有被赋值,所以爆出undefined。总结就是:只要声明了var a=20;无论位置在哪,都不会再往上查找,还没来得及赋值就被alert了。代码就相当于:

    	var a=10;
    	function aa(){
    		var a;  //已经声明有a就不会再往上查找
    		alert(a);//执行时还未声明
    	        a=20;    //赋值已经晚了。已经爆出undefined了!
    	}
    	aa();//undefined


    那如果把函数内部的var a=10;的var 去掉呢?请看代码?

    var a=10;
    function test(){
    	a=20; //去掉了var,a也变为全局
    	alert(a);
    }
    test(); //20

    很明显结果是20,给人的错觉是直接使用了内部的a=20,其实这样理解是错的,因为没有var,a变为全局,对函数来说内部是没有a的,会向上查找a,很高兴的找到了var a=10;没错,刚找到时依然为10,然后把a的值也就是10带入函数内部后,发现:尼玛!函数里有a=20;这条代码,就这样丢掉a的原值10,重新使用20,这样再被弹出。于是乎我们就看到了20,这个20可不是直接从内部拿来用的,而是从外面溜了一圈后才使用的20。


    内部环境可使用外部的变量,外部变量不能使用内部的:

    var a=10;
    	function aa(){
    		function bb(){
    			var a=20;
    			alert(a);//此处负责弹出bb自己本身的a :20
    		}
    		bb();
    		alert(a);//此处负责弹出全局中的10
    		
    	}
    	aa(); //先弹出20,再弹出10




    都知道函数中return后面的代码永远不会执行(不知道的面壁),但也不要太粗心,因为对于函数声明来说有个特性就是提前执行,也就是会把函数声明的代码放到代码块顶端优先执行,这样哪怕该类函数是放在return后面依然会执行,并且在return前就执行:

                    (function f(){
    			function f(){alert('1');}
    			return f(); //函数声明有提前执行的作用,也就是在return(虽然return后面的代码不执行)
    			function f(){alert('2');}
    			function f(){alert('3');}
    			function f(){alert('4');}//函数声明提前执行,f()已经被一次次更新
    			alert('sss');//永远不会执行因为在return后的代码不执行(匿名函数除外)
    		})()   //4  
    以上代码执行结果为4,因为前面的函数都被最后一个重写(函数名一样),且在return之前执行,但最后一句alert('sss');永远不会执行,因为它没有像函数声明一样的提前执行待遇,并且位置处在return后面,被无情的抛弃,永远不会执行。

    关于引用型数据:

    先来了非引用数据吧:

    var a=1;
    var b=a;
    b++;   //更改b 加1
    alert(b); //2 弹出更改后的b
    alert(a);//1   不变,也就是说b的改变不影响a

    但引用型数据就不行了:

    var a=[1,2,3];
    var b=a;
    b.push(4); //修改b
    alert(b);//1234  改变
    alert(a);//1234   也改变,说明两者共同使用一个引用,共同指向一个内存区域,一个修改,另一个也跟着改
    

    上面代码只是修改b,那如果对b重新赋值呢?

    var a=[1,2,3];
    var b=a;
    b=[4,5,6];
    alert(b);//456  
    alert(a);//123 不变
    

    随着b的重新复制,那么就切断了引用,另立门户,和a再也没有任何关系。


    当全局变量以参数的方式传进函数内部后,在内部对变量的操作就不再影响外部的全局,但引用同样不符合这条规则。

    先来段非引用:

            var a=10;
    	function test(a){
    		a=a+3;
    		alert(a);// 负责弹出传进函数内部且被修改后的a,值为13
    		
    	}
    	test(a); //负责弹出全局中的10,说明全局没有被修改
    	alert(a); //先弹出13,后弹出10

    以上原理注释中已经说明,如果去掉传参的方式呢?

            var a=10;
    	function test(){
    		a=a+3;
    		alert(a);//13
    	}
    	test(a);  //13
    	alert(a); //结果13, 13

    没有传进参数,a就被函数内部修改(内部有权使用外部变量)。


    引用型哪怕以传参的方式依然会影响外部变量:

    var a=[1,2,3];   //引用型传进之后在函数内部改变依然影响函数外部
    	function test(a){
    		a.push(4);
    		alert(a)
    	}
    	test(a); //1,2,3,4
    	alert(a); // 1,2,3,4  全局变量已经被影响

    以上代码证明引用型哪怕用参数传入也一样会牵连。当然了如果重新赋值(不是用push修改)会切断引用,彻底取消牵连:

    var a=[1,2,3];   //引用型传进之后在函数内部改变依然影响函数外部
    	function test(a){
    		a=[3,3,3,3,3,3]; //重新复制则不再受外界影响,因为赋值切断了引用
    		alert(a)
    	}
    	test(a);  //3,3,3,3,3,3
    	alert(a); // 1,2,3 不再受影响



    这些就是常见的面试题考查的知识点,把这些掌握能解决很多类型的面试题,希望对你有所帮助,一起努力。














  • 相关阅读:
    哈夫曼树与哈夫曼编码
    HTML & CSS整理
    MYSQL整理
    数据库报告存档
    一些网络报错信息记录
    复活~
    你必须知道的Docker数据卷(Volume)
    Sql Prompt 10下载安装破解图文教程
    通过Logstash由SQLServer向Elasticsearch同步数据
    Linux(CentOS)配置Docker随宿主机自启,容器自启( --restart=always)
  • 原文地址:https://www.cnblogs.com/chayangge/p/4288693.html
Copyright © 2011-2022 走看看