前端面试题准备 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>

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

原文地址:https://www.cnblogs.com/liuyouying/p/5027292.html