每个函数都包含俩个非继承而来的方法:apply()call(),这俩个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值,以扩充函数赖以运行的作用域。一般来讲,this总是指向调用某个方法的对象。

比如:

var color="skyblue";
function myColor(){
console.log(this.color); //skyblue
console.log(this); //window
}
window.myColor();

window对象调用的 myColor 函数,内部 this 自然指向了windowthis.color也是window.color

一、apply()

这个方法接收2个参数,第一个是在其中运行函数的作用域,第二个是参数数组,其中,第二个参数可以是 Array 构造函数的实例,也可以是 arguments 对象。

例子1:

var fruit="橘子";
var fruitObj={
fruit:"香蕉"
}
function changeFruit(){
console.log(this.fruit);
}
changeFruit.apply(window); //橘子
changeFruit.apply(fruitObj); //香蕉

例子2:

function sum(a,b){
return a+b;
}
function callSum1(a,b){
console.log(sum.apply(this,[a,b])); //传入Array的实例
}
function callSum2(a,b){
console.log(sum.apply(this,arguments)); //传入arguments对象
}
callSum1(10,20); //
callSum2(10,20); //

例子3:

function SuperType(fruit){
this.fruit=fruit;
this.getSuperValue=function(){
console.log(this.fruit);
}
}
function SubType(fruit){
SuperType.apply(this,arguments); //橘子
}
var instance=new SubType("橘子");
instance.getSuperValue();

二、call()

call() 方法的用法和作用与 apply() 一样,只是再填入第二参数时,必须一一列举出来。

例子1:

function sum(a,b){
return a+b;
}
function callSum(a,b){
console.log(sum.call(this,a,b));
}
callSum(10,20); //

例子2:

function SuperType(fruit){
this.fruit=fruit;
this.getSuperValue=function(){
console.log(this.fruit);
}
}
function SubType(fruit){
SuperType.call(this,fruit); //橘子
}
var instance=new SubType("橘子");
instance.getSuperValue();

总结:使用apply()还是call(),完全取决于你采用哪种给函数传递参数的方式最方便。如果你打算直接传入arguments对象,或者包含函数中先接收到的也是一个数组,那么使用apply() 肯定最方便,否则,使用call()可能更方便。(在不给函数传递参数的情况下,使用哪个方法都无所谓。)

最新文章

  1. 工作总结_JS_1
  2. 流的文件操作(File)
  3. Guava----Function
  4. (原创)VM中的CentOS6.4中安装CloudStack6.3①
  5. spring 定时器Quartz
  6. 记一次惨痛的线上bug
  7. lamp环境编译(apache2.4.7 php5.4.25 mysql 5.5.23)
  8. 私有云Mariadb集群搭建
  9. asp中的动态数组
  10. 一句python,一句R︱模块导入与查看、数据读写出入、数据查看函数、数据类型、遍历文件
  11. 【spring源码分析】IOC容器初始化(四)
  12. 好的RESTful API的设计原则
  13. 【bzoj4818】 Sdoi2017—序列计数
  14. oracle servicename 与SID的区别
  15. Huawei DHCP 全局配置与接口配置
  16. linux 删除指定日期之前的文件
  17. thinkphp3返回json或jsonp数据
  18. ST-PUZZLE-2.0(一个益智游戏)
  19. Balanced and stabilized quicksort method
  20. CentOS 6.9下iptables通过raw表实现日志输出和调试

热门文章

  1. Java——equals方法---18.10.18
  2. jsp中的input
  3. Spring MVC: 环境搭建并实现简易的HelloWorld
  4. 50道基础的java面试题
  5. 问题:docker pull 用户登陆tricky,Error response from daemon: unauthorized: incorrect username or password
  6. Pc移植到Mac的技术细节
  7. CCF-NOIP-2018 提高组(复赛) 模拟试题(七)
  8. Web负载均衡技术
  9. Leetcode 673.最长递增子序列的个数
  10. MVC项目用Windsor注入