美文网首页技术知识js相关知识点和易出错的题目Web前端之路
一些经典的前端面试题分析--js函数与变量提升

一些经典的前端面试题分析--js函数与变量提升

作者: _三月 | 来源:发表于2017-03-02 20:40 被阅读1402次

    前面讲完变量提升的知识和注意点,这次主要是来点题目操练一下,废话不多说了,直接上案例.
    注意undefined和报错的区别:
    变量申明未赋值--undefined
    未申明也没有赋值而直接使用变量--系统会报错

    • 先热热身:
      demo1
    function test() {
            var num = 123;
            console.log(num);
        }
        test();            //123(test函数中的局部变量num,这个很好理解我就不解释了)
        console.log(num); //报错(全局变量中没有声明num变量,无法访问下一级函数作用域中的变量,这个是考察作用域链的知识)
    

    demo2:
    考察了变量提升是分作用域的这个知识点,在函数内部使用变量之后申明变量,会把申明变量提升到log之前,所以下面的例子中打印1的结果是undefined而不是 "我是MT"和报错,打印3同demo1就不再重复一遍了.

        var str= "我是MT";
        test();
        function test() {
            console.log(str); //undefined
            var str= "哈哈哈";
            console.log(str); //"哈哈哈"
        }
        console.log(str);       //我是MT
    

    demo3:
    test函数内部有变量申明var a;会提升到函数作用域的最前面,全局没有变量a,所以结果是undefined而不会报错.

       function test(){
            if("a" in window){
                var a = 10;
            }
            console.log(a); 
        }
    
        test();//undefined
    

    demo4:
    这个题目是针对demo3做对比的, if语句没有作用域,var a提升到最前面,所以window中有'a',打印结果为10.

     if("a" in window){
            var a = 10;
        }
        console.log(a); //10
    

    demo5:
    此题是demo4的一个变种,同理变量提升,只是没有进入判断语句,所以为undefined;

    if(!"a" in window){
            var a = 10;
        }
        console.log(a); //undefined
    
    • 来点难的:
      demo6:
      此题乍看简单,实则有坑:
        var foo = 1;
        function bar() {
            if(!foo)
            {
                var foo = 10;
            }
            console.log(foo); 
        }
        bar();//   10
    

    我把demo6的代码做了变量申明和函数申明提升,改成下面这个样子,现在理解就容易多了:这里foo为undefined,所以!foo结果为true;

        var foo;//变量申明提升
        function bar() {//函数申明提升
            if(!foo) //foo为undefined,!foo结果为true
            {
                var foo = 10;
            }
            console.log(foo); 
        }
        foo = 1;
        bar();//   10
    
    • 放大招了哈哈,前面做了这么多,大家请先思考一下这个题,如需要答案分析,请简信我.如问的人多了,我会写一篇文章单独分析一下这道题.
      demo7
        function Foo() {
            getName = function(){
                console.log("1");
            };
            return this;
        }
        Foo.getName = function() {
            console.log("2");
        };
    
        Foo.prototype.getName = function(){
            console.log("3");
        };
    
        var getName = function() {
            console.log("4");
        };
        function getName(){
            console.log("5");
        }
        Foo.getName(); // 2 
        getName(); // 4
        Foo().getName(); //1 ? 4 ? 2 ?报错   
        getName(); // ?    1
        new Foo.getName(); //  2
        new Foo().getName(); // 3
        new new Foo().getName(); // 3
    

    所有的文章都是自己的一些学习心得,有些题目是我摘抄的,但是思路是我自己的,有不足之处,欢迎大家指正.O(∩_∩)O谢谢!

    相关文章

      网友评论

      • zwkkkk1:demo6理解有误吧
        js没有块级作用域,if中的var foo会提升到if前,局部变量将全局变量屏蔽了,你将var foo =10; 改为 foo = 10;就可以输出1了,代码应该是转变为下面这个
        var foo = 1;
        function bar() {
        var foo;
        if(!foo)
        {
        foo = 10;
        }
        console.log(foo);
        }
        bar();// 10

        欢迎交流
        小椰子表姐:@ChasenH :blush:
        8f1832ad876c:@小椰子表姐G 赞同
        小椰子表姐:var foo; // 全局变量
        function bar() {
        var foo; // 局部变量
        if(!foo)
        {
        foo = 10;
        }
        console.log(foo);
        }
        foo = 1;
        bar();
        我认为最终应该是这样子.
        如果按照作者上面写的理解是有问题的.
      • 宝金_105c:大神是时候出山给小弟们说下思路了,😀
      • 19e1cc7022de:this指向是foo吧,foo().getName()应该还是‘1’吧,后面的就想不明白了,大神快写后篇呗
      • e042cbe4da21:你这个大招,考查的好像是this啊:sweat: ,Foo().getName();Foo()返回的this指向全局。
      • 29e8b0aa682e:好好好,谢谢
      • 酱油_:问下楼主,题都是在哪找的?
        _三月:@不只是个看客 总结的,网上也有一些

      本文标题:一些经典的前端面试题分析--js函数与变量提升

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