一、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>
其它待续,在公司陪合作伙伴加班。