• 前端工程师面试题JavaScript部分(第三季)


    请定义这样一个函数function repeat (func, times, wait) {} 这个函数能返回一个新函数,比如这样用 var repeatedFun = repeat(alert, 10, 5000),调用这个 repeatedFun ("hellworld") 会alert十次 helloworld, 每次间隔5秒

    function repeatFun(fn,times,wait){
        var i=0;
           var handle = setInterval(function(){
               fun.apply(null,arguments);
                if(i==9){
                    clearInterval(handle);
                };
                i++;
            },wait)
    }
    function fun(){
        console.log('hello world')
    }
    repeatFun(fun,10,100)

    console代替了alert,而且没有返回函数,闭包一下即可

    function repeat (func, times, wait) {
        //不用匿名函数是为了方便调试
        function repeatImpl(){
            var handle,
                _arguments = arguments,
                i = 0;
            handle = setInterval(function(){
                i = i + 1;
                //到达指定次数取消定时器
                if(i === times){
                    clearInterval(handle);
                    return;
                }
                func.apply(null, _arguments);
            },wait);
        }
    
        return repeatImpl;
    }
    
    //测试用例
    var repeatFun = repeat(alert, 4, 3000);
    
    repeatFun("hellworld");

     第二题

    写一个函数stringconcat, 要求能var result1 = stringconcat("a", "b")  result1 = "a+b",var stringconcatWithPrefix = stringconcat.prefix("hellworld");var result2 = stringconcatWithPrefix("a", "b")  result2 = "hellworld+a+b",此题需要静态方法的思路才能解;

    第三题

    function Foo() {
        getName = function () { alert (1); };
        return this;
    }
    Foo.getName = function () { alert (2);};
    Foo.prototype.getName = function () { alert (3);};
    var getName = function () { alert (4);};
    function getName() { alert (5);}
     
    //答案:
    Foo.getName();//2首先访问静态属性
    getName();//4访问变量声明提前
    Foo().getName();//1
    getName();//1
    new Foo.getName();//2
    new Foo().getName();//3
    new new Foo().getName();//3

    其中知识点

    console.log('x' in window);//true不管是不是字符串,就是当变量用
    var x;
    x = 0;
    衍生的if("a" in window){
     var a = 10;
    }
    console.log(a);

    关于变量声明提前的  

    var x;
    function x(){}
    console.log(x);
    x=1;
    //上题中执行顺序应该是这样,被覆盖了x的属性
    最终执行的顺序是

    function
    Foo() { getName = function () { alert (1); }; return this; } var getName;//只提升变量声明 function getName() { alert (5);}//提升函数声明,覆盖var的声明 Foo.getName = function () { alert (2);}; Foo.prototype.getName = function () { alert (3);}; getName = function () { alert (4);};//最终的赋值再次覆盖function getName声明
    getName();//最终输出4

     挨个解答:

    第一问:

    Foo.getName();静态属性,返回2

    第二问

    getName();变量声明提前,函数声明提前,函数覆盖变量声明4

    第三问

    Foo().getName();//执行第一个函数返回的this
    Foo函数中赋值一个全局变量 getName=function(){alert(1)}
    当前作用域没有getName,那么向上寻找也就是window,覆盖外面的getName的定义
    这就是污染了全局变量了,this也指向了window,相当于window.getName

    第四问

    直接调用getName(),全局变量已经被污染了

    下面三问涉及运算符优先级

    圆括号()>成员访问>new带参数列表>函数调用>new不带参数列表>递增递减>逻辑运算符>一元加法减法>typeof>算数>位移>比较>in,instance>条件,赋值,逗号

    第五问

    new Foo.getName();
    //相当于 new(Foo.getName)(),这里注意运算符优先级,new一个(Foo.getName)2

    第六问

    (new Foo()).getName();
    //关于返回值的问题

    构造函数返回值可以没有返回值也可以没有,undifined,有返回值的时候检查是不是引用类型,

    是基本类型等于undefined,实例里返回实例化对象

    是引用类型的时候返回undefined,实例返回这个引用类型

    此处返回了this是实例化对象,没有getName属相,通过原型链找到构造函数的原型对象,3

    第七问

    new((new Foo().getName)();//3
  • 相关阅读:
    C#设计模式(6)——原型模式(Prototype Pattern)
    C#设计模式(4)——抽象工厂模式
    C#设计模式(3)——工厂方法模式
    C#设计模式(2)——简单工厂模式
    cmd 打 jar 包
    java eclipse 中给args 传递参数
    java 中值传递和引用传递(转)
    java unreachable code不可达代码
    java语言中if语句的用法
    java中 构造器与void
  • 原文地址:https://www.cnblogs.com/wgdong/p/5288598.html
Copyright © 2020-2023  润新知