美文网首页技术知识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谢谢!

相关文章

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

    前面讲完变量提升的知识和注意点,这次主要是来点题目操练一下,废话不多说了,直接上案例.注意undefined和报错...

  • javascript基础笔试题

    分析BAT等大公司的一些经典前端面试题 主要关注点是JS的一些核心技术的理解和运用 相关技术点 引用变量赋值传递 ...

  • 前端面试 - 收藏集 - 掘金

    一道常被人轻视的前端 JS 面试题 - 前端 - 掘金 目录前言第一问第二问变量声明提升函数表达式第三问第四问第五...

  • js 面试题 函数声明 变量声明

    一个常见的函数声明和变量的面试题 题目一: 题目二: 想回答出来上面的面试题来,先要理解js中函数声明提升、变量声...

  • js变量声明提升与函数表达式

    1.变量声明提升 js引擎会把变量声明与函数声明都提升到当前函数的顶部。eg: js引擎编译为 2.函数表达式 对...

  • js 预编译

    js运行 一、语法分析 二、预编译函数声明整体提升变量声明提升;var a = 123; 这个叫变量声明加赋值;如...

  • JS中的提升

    JS中包含两种提升,变量提升和函数提升。 变量提升 变量提升只能是var或者function声明的变量或者函数,l...

  • JavaScript 中的提升(Hoisting)

    前言: JS中在声明函数与变量的时候是存在变量提升的问题,一不注意,有的时候会导致一些bug,本文主要就是针对JS...

  • 猫眼

    var变量提升,函数声明提升,消除变量声明提升(let); 高阶函数,函数式的编程,柯里化 原型链继承,js面向对...

  • 第11题- 变量提升和函数提升

    面试题目(腾讯): 下面题目输出结果是什么? 答案解析: 这道题目主要考察JS的变量提升和函数提升相关的知识点 1...

网友评论

  • 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