1、apply和call(改变this指向)
apply:函数名字/方法名字.apply(对象,[参数1,参数2]);
call:函数名字/方法名字.call(对象,参数1,参数2);
function f1(x,y){
console.log((x+y)+this);
return "返回值";
}
//调用
var r1=f1.apply(null,[1,2]);
var r2=f1.call(null,1,2);
//改变指向
var obj={
sex:"男"
};
var r3=f1.apply(obj,[1,2]);
var r4=f1.call(obj,1,2);
//方法改变
function Person(age){
this.age=age;
}
Person.prototype.sayHi=function(x,y){
console.log((x+y)+this.age);
};
function Student(age){
this.age=age;
}
var per=new Person(10);
var stu=new Student(100);
per.sayHi.apply(stu,[10,20]);
per.sayHi.call(stu,10,20);
2、bind(复制一份)
函数名字/方法名字.bind(对象,参数1,参数2);---返回值复制之后的函数/方法
function Person(age){
this.age=age;
}
Person.prototype.play=function(){
console.log(thid+"===="+this.age)
};
function Student(age){
this.age=age;
}
var per=new Person(10);
var stu=new Student(20);
var ff=per.play.bind(stu);
ff();
3、bind应用
//通过对象,调用方法,产生随机数
function ShowRandom(){
//1-10的随机数
this.number=parseInt(Math.random()*10+1);
}
//添加原型方法
ShowRandom.prototype.show1=function(){
//改变了定时器this指向,从window到实例对象
window.setInterval(this.show2.bind(this),1000);
};
ShowRandom.prototype.show2=function(){
console.log(this.number);
};
var sr=new ShowRandom();
sr.show1();
4、函数成员
name:函数名字,只读,不能修改
arguments:实参的个数
length:函数定义形参的个数
caller:调用者
5、函数作为参数参数,如果是命名函数,只传入函数名字,没有括号
6、函数作为参数使用
var arr=[1,100,20,200,40];
排序
arr.sort(function(obj1,obj2){
if(obj1>obj2){
return 1;
}else if(obj1==obj2){
return 0;
}else{
return -1;
}
});
console.log(arr);
7、函数作为返回值
function File(name,size,time){
this.name=name;
this.size=size;
this.time=time;
}
var f1=new File("xiaosu","800M","2010-12-12");
var f2=new File("xiao","200M","2017-12-12");
var f3=new File("su","400M","2012-12-12");
var arr=[f1,f2,f3];
function fn(attr){
return function getSort(obj1,obj2){
if(obj1[attr]>obj2[attr]){
return 1;
}else if(obj1[attr]==obj2[attr]){
return 0;
}else{
return -1;
}
}
}
var ff=fn("name");
arr.sort(ff);
for(var i=0;i<arr.length;i++){
console.log(arr[i].name+"==="+arr[i].size+"==="+arr[i].time);
}
8、闭包
函数闭包
function f1(){
var num=10;
function f2(){
console.log(num);
}
f2();
}
f1();
对象闭包
function f3(){
var num=10;
var obj={
age:num
};
console.log(obj.age);
}
f3();
9、闭包产生相同随机数
function f1(){
var num=parseInt(Math.random()*10+1);
return function(){
console.log(num);
}
}
var ff=f1();
ff();
ff();
ff();
如果想要缓存数据,就把这个数据放在里外层中间
10、闭包点赞
function my$(tagName){
return document.getElementByTagName(tagName);
}
function getValue(){
var value=2;
return function(){
this.value="赞("+(value++)+")";
}
}
var btnObjs=my$("input");
for(var i=0;i<btnObjs.length;i++){
btnObjs[i].οnclick=getValue();
}
11、沙箱:(function(){}()); (function(){})();
var getTag=10;
var dvObjs=20;
var pObjs=30;
(function(){
function getTag(tagName){
return document.getElementsByTagName(tagName)
}
var dvObjs=getTag("div");
for(var i=0;i<dvObjs.length;i++){
dvObjs[i].style.border="2px solid red";
}
var pObjs=getTag("p");
for(var i=0;i<pObjs.length;i++){
pObjs[i].style.border="2px solid red";
}
}());
12、递归:函数中调用自己,要有结束条件
递归案例求n个数字的累加和
function getSum(x){
if(x==1){
return 1;
}
return x+getSum(x-1);
}
console.log(getSum(100));
13、案例
一个数字各个位数上数字和
function getEverySum(x){
if(x<10){
return x;
}
//先获取个位数
return x%10+getEverySum(parseInt(x/10));
}
console.log(getEverySum(123));
斐波那契数列
function getFib(x){
if(x==1||x==2){
return 1;
}
return getFib(x-1)+getFib(x-2);
}
console.log(getFib());