博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
call和apply用途与使用方法
阅读量:5222 次
发布时间:2019-06-14

本文共 2530 字,大约阅读时间需要 8 分钟。

当你看代码时,经常会看到以下情形:(在这个博客里面,参数context是执行上下文的意思,params是参数的意思)

Object.prototype.toString.call(context, params);

fn.call(context, params);

Array.prototype.slice.call(context, params);

等等。

不要惊奇,不要慌张,看完这篇文章下次你就不怕了,甚至自己也会经常这么写了。

先说以下call,apply先不提了,等你把call学会了,到文章末尾也就把apply学会了。

用途:改变this指向

Object.prototype.toString.call(context, params);

这句话就相当于执行toString函数,如:toString(params); 但是为什么不直接这样写呢?

先看一段代码的执行结果:

var str = "stringstr";var num = 12;var arr = [1, 2];var obj = {name: "solid"};console.log(str.toString()); // stringstrconsole.log(num.toString()); // 12console.log(arr.toString()); // 1,2console.log(obj.toString()); // [object Object]console.log(Object.prototype.toString.call(str)); // [object String]console.log(Object.prototype.toString.call(num)); // [object Number]console.log(Object.prototype.toString.call(arr)); // [object Array]console.log(Object.prototype.toString.call(obj)); // [object Object]

如果你调用Object.prototype.toString()函数是不是可以查看变量的类型啊,进而进行别的逻辑。

在js中,基本上所有的变量都是从Object继承来的,但是他们又都改写了toString方法,所以调用自身的toString方法会得到重写后的函数的结果。有的并没有什么实际的用处,如字符串的toString方法。

下面看点实用的引用吧:

 

// A程序员写了一个函数

function Person(name, age, sex){
this.name = name;
this.age = age;
this.sex = sex;
}

 

// 现在一个对象里,你的需求里也需要这三个参数

var zhangsan = {};
// 你就可以这样借用他的函数为你效力
Person.call(zhangsan, "张三", 18, "男");
console.log(zhangsan); // {name: "张三", age: 18, sex: "男"}

// 你可能还需要其他的信息,再写就可以了function say(){    this.say = function (){        console.log(this.name + "具有说话的能力");    }}say.call(zhangsan);zhangsan.say(); // 张三具有说话的能力

在上面这个例子中,zhangsan这个对象借用了其他的函数实现了自己的功能。这样调用函数,是不是相当于把Person函数中的this指向了zhangsan,把say函数中的this指向了zhangsan?结果实现了调用其他构造函数的方法,为自己实现了功能。

开始学习的时候,我看call也不顺眼,就直接看成前面那个方法的执行。

当不需要改变this时,可以这样调

fn.call(null, params);

不过这个好像没有什么意义,还不如直接写fn(params);即调用函数。

使用方法:fn.call(context, params);

还有其他的如:

Object.prototype.toString.call(context, params);

Array.prototype.slice.call(context, params);

在这里相当于: toString.call(context, params);   slice.call(context, params);

只是toString方法和slice不是全局的,而是Object和Array原型上的一个方法,所以需要这样来写。

看到这里对你的理解有没有一点帮助呢?有没有感觉使用起来也很简单呢。

下面说说apply。

apply的用途和call一模一样,只是参数有区别。call的参数是用逗号隔开的,apply的参数是一个数组。例子具体见下面的代码

Person.call(zhangsan, "张三", 18, "男");Person.apply(zhangsan, ["张三", 18, "男"]);// 这两句是等价的

apply什么时候用呢?看下面的例子把

// 已知一个数组,求数组中的最大值var numArr = [12, 21, 9, 18, 100, 0];var max = Math.max.apply(null, numArr);console.log(max); // 100 // 下面这个求最大值的函数你可以直接收藏使用了。

function max(){

  return Math.max.apply(null, arguments);
}
console.log(max(12, 21, 9, 18, 100, 0)); // 100

 

 

转载于:https://www.cnblogs.com/zhaodesheng/p/10071579.html

你可能感兴趣的文章
Java编程思想总结笔记Chapter 5
查看>>
[LeetCode]662. Maximum Width of Binary Tree判断树的宽度
查看>>
【Python学习笔记】1.基础知识
查看>>
梦断代码阅读笔记02
查看>>
selenium学习中遇到的问题
查看>>
大数据学习之一——了解简单概念
查看>>
Linux升级内核教程(CentOS7)
查看>>
Lintcode: Partition Array
查看>>
分享适合个人站长的5类型网站
查看>>
类别的三个作用
查看>>
【SICP练习】85 练习2.57
查看>>
runC爆严重安全漏洞,主机可被攻击!使用容器的快打补丁
查看>>
Maximum Product Subarray
查看>>
solr相关配置翻译
查看>>
通过beego快速创建一个Restful风格API项目及API文档自动化(转)
查看>>
解决DataSnap支持的Tcp长连接数受限的两种方法
查看>>
Synchronous/Asynchronous:任务的同步异步,以及asynchronous callback异步回调
查看>>
ASP.NET MVC5 高级编程-学习日记-第二章 控制器
查看>>
Hibernate中inverse="true"的理解
查看>>
高级滤波
查看>>