美文网首页
5个典型的JavaScript面试题

5个典型的JavaScript面试题

作者: Michael_lpf | 来源:发表于2017-01-19 17:38 被阅读0次

    原文在这里。我写下来只是为了作个人笔记。


    • 一、考虑以下代码的输出:
    (function(){
    var a = b = 5;
    })()
    console.log(b);
    

    结果:5
    代码有两个陷阱:
    一,看上去是闭包空间内声明两个变量 a、b, 但事实是:a是匿名函数内用 var 声明的一个变量,而 b 不是。
    b 被看做是一个全局变量,并在这个匿名函数内被赋值5,所以在函数外尝试对 b 取值是可行的, 但 a 不行。
    二,并没有使用严格模式 'use strict',在严格模式下,会报错,因为严格模式要求显示调用全局变量:

    (function(){
    var a = window.b = 5;
    })()
    console.log(b);
    

    • 二、创建内置方法: 给String对象创建一个repeatify方法,该方法接收一个参数作为字符串的重复次数,最后返回指定重复次数的字符串, 例如:
      console.log(‘Hello’.repeatify(3));
      输出 HelloHelloHello。
    String.prototype.repeatify = String.prototype.repeatify || String.prototype.repeatify = function(num){
      var str = '';
      for (var i = 0; i < num; i++){
        str += str;
      }
      return str;
    }
    

    这题检测我们原型方面的知识,也检测我们能否扩展内置数据类型方法。


    • 三、考虑以下代码的输出:
    function test(){
      console.log(a);
      console.log(foo());
      var a = 1;
      function foo(){
        return 2;
      }
    }
    test();
    

    结果:undefined,2。
    变量 a 和函数 foo 的声明都能被提升至外部函数 test 的顶部。
    但此时的变量 a 并没有被赋值,也就是变量声明被提升,但赋值不会被提升。也就相当于 var a 声明在 console.log(a) 之前,但 a = 1赋值在 console.log(a) 之后。上面代码相当于:

    function test(){
      var a;
      function foo(){
        return 2;
      }
      console.log(a);
      console.log(foo());
      a = 1;
    }
    test();
    

    • 四、考虑以下代码的输出:
    var name = 'Tom';
    var obj = {
      name: 'Jerry',
      prop: {
        name: 'Kitty',
        getName: function(){
          return this.name;
        }
      }
    }
    console.log(obj.prop.getName);
    var test = obj.prop.getName;
    console.log(test());
    

    结果:Kitty,Tom
    JavaScript 中 this 所指代的函数上下文,取决于调用的方式,而不是被定义的方式。
    第一个 console.log() 中,getName 被 obj.prop 对象调用,于是返回obj.prop 的 name 属性值。
    当 obj.prop.getName 赋值给全局变量 test 时,当前上下文指代全局对象(因为 test 被隐式看作是全局对象的属性),基于此,getName 返回 window 的 name。


    • 五、修复前一个问题,是第二个 console.log() 输出 Kitty。
      通过使用 apply() / call() 强制转换上下文:
      console.log(test.apply(obj.prop));
      console.log(test.call(obj.prop));

    [完]

    相关文章

      网友评论

          本文标题:5个典型的JavaScript面试题

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