<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script> //第一个用途:函数上下文模式改变this的指向 var age=19; function fun() { console.log(this.age); } var obj={ age:26 }; fun.apply(obj); fun.call(obj) //总结:apply和call,第一个参数功能都是一样,都是可以改变this指向为第一个参数对象。 //当传递对象为null的时候,为window调用 //应用1:将参数用“-”拼接 function fun2() { //arguments是一个伪装数组,不能调用join方法,通过apply转换替代对象来调用 console.log(Array.prototype.join.apply(arguments, ["-"])); console.log(Array.prototype.join.call(arguments, "-")); } fun2(1,2,3,4); //应用4:借用构造函数实现继承 function Persion() { this.name="张三"; this.age=18; } function Student() { Persion.apply(this); } var stu=new Student(); console.log(stu); //第二个用途:第二个到第N个参数的处理 function fun1(name,work) { console.log("名字为"+name+";年龄为"+this.age+"职业"+work); } var obj1={ age:30 }; /* * apply和call第二个参数都是函数的参数 * apply是传递的数组,执行的时候是将数组遍历然后作为参数传递。 * call传递的是分开的参数 * */ fun1.apply(obj1,["张三","金融"]); fun1.call(obj1,"张三","金融"); //应用2:apply的遍历 window.onload=function () { var divs=document.querySelectorAll("div"); var spans=document.querySelectorAll("span"); var arr=[]; arr.push.apply(arr,divs); arr.push.apply(arr,spans); for(var i=0;i<arr.length;i++){ arr[i].style.backgroundColor="red"; } } //应用3:求最大值 var arr1=[3,6,1,78,23]; console.log(Math.max.apply(null, arr1)); </script> <style> div,span{ display: inline-block; width: 50px; height: 50px; border: 1px solid pink; } </style> </head> <body> <div></div> <div></div> <div></div> <div></div> <br> <span></span> <span></span> <span></span> <span></span> </body> </html>