• 前端面试题准备 3


    一、apply和call

    主要是用来更改上下文,即this的指向

    var func=new function(){this.a="func"}
    var myfunc=function(x){
        var a="myfunc";
        console.log("this.a:"+this.a);
        console.log("a:"+a);
        console.log("x:"+x);
    }
    myfunc.call(func,"var");

    this.a:  func
    a:  myfunc
    x:  var

    可见更改的是this

    有一个说法非常好:平时是对象调函数,apply/call是函数调对象

    如果在javascript语言里没有通过new(包括对象字面量定义)、call和apply改变函数的this指针,函数的this指针都是指向window

    • apply 、 call 、bind 三者都是用来改变函数的this对象的指向的;
    • apply 、 call 、bind 三者第一个参数都是this要指向的对象,也就是想指定的上下文;
    • apply 、 call 、bind 三者都可以利用后续参数传参;
    • bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用 。

    二、一道面试题

    function log(){
      console.log.apply(console, arguments);
    };
    log(1);    //1
    log(1,2);    //1 2
    function log(){
      var args = Array.prototype.slice.call(arguments);
      args.unshift('(app)');
      
      console.log.apply(console, args);
    };

    代理console.log,以及在消息前面加上字符(如本例的app),看到出现几次了,顺便记下来

    三、caller和callee

    caller返回一个函数的引用,这个函数调用了当前的函数;

    1 这个属性只有当函数在执行时才有用
    2 如果在javascript程序中,函数是由顶层调用的,则返回null

    callee返回正在执行的函数本身的引用,它是arguments的一个属性

    1 这个属性只有在函数执行时才有效
    2 它有一个length属性,可以用来获得形参的个数,因此可以用来比较形参和实参个数是否一致,即比较arguments.length是否等于arguments.callee.length
    3 它可以用来递归匿名函数

    var fn=function(n){ 
    if(n>0) return n+fn(n-1); 
    return 0; 
    } 
    alert(fn(10)) 

    使用callee让代码更加简练,也防止了全局变量的污染

    var fn=(function(n){ 
    if(n>0) return n+arguments.callee(n-1); 
    return 0; 
    }); 
    alert(fn(10)) 

    四、正则去html标签

    var reg = /</?w+/?>/gi;
    var str = "<div>这里是div<p>里面的段落</p></div>";
    console.log(str.replace(reg,”"));

    这道题还是比较经典的

    /?表示0个或1个/,如果是结束标签,就有/,如果是开始的,就没有。如</div>中的</

    w+是标签名,如</div>中的div

    /?同理,在结束时,有些自结束标签,如<img/>,最后就有/,普通开始标签没有/,如<div>

    其它待续,在公司陪合作伙伴加班。

  • 相关阅读:
    MainFrm.cpp
    MyView.h
    我的东软实习项目一:车牌识别之MFC----MyView.cpp
    洛谷P1055 字符串的处理-----ISBN
    跳出多重循环------设置标志量
    单链表的创建及操作
    线性表的建立及运算
    JVM--你常见的jvm 异常有哪些? 代码演示:StackOverflowError , utOfMemoryError: Java heap space , OutOfMemoryError: GC overhead limit exceeded, Direct buffer memory, Unable_to_create_new_native_Thread, Metaspace
    JVM-gcRoots 和 强引用,软引用, 弱引用, 虚引用, 代码演示和应用场景
    JUC 并发编程--08,线程池,三大方法,七大参数,4种拒绝策略,代码演示
  • 原文地址:https://www.cnblogs.com/liuyouying/p/5027292.html
Copyright © 2020-2023  润新知