之前在学习JavaScript的时候写的:Mr.J--JS学习(继承模式发展史)里面写了我对原生JS call和apply的理解,以及原型链的应用:prototype

apply&call

JavaScript中的每一个Function对象都有一个apply()方法和一个call()方法,它们的语法分别为:

/*apply()方法*/
function.apply(thisObj[, argArray])/*call()方法*/
function.call(thisObj[, arg1[, arg2[, [,...argN]]]]);

定义:

apply:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.apply(A, arguments);即A对象应用B对象的方法。

call:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.call(A, args1,args2);即A对象调用B对象的方法。

 apply和call方法的作用:

专门用于修改方法内部的this

example

1.通过window.test找到test方法

function test() {console.log(this);
}
window.test();

2.通过apply(obj)将找到的test方法内部的this修改为自定义的对象

function test() {console.log(this);
}var obj = {"name": "yjk"};
window.test.apply(obj);

同样,使用call方法也可以进行修改:

window.test.call(obj);

1.通过window.sum找到sum方法

function sum(a, b) {console.log(this);console.log(a + b);
}
window.sum.call(obj, 1, 2);

2.通过apply(obj)将找到的sum方法内部的this修改为自定义的对象
3.将传入数组中的元素依次取出, 传递给形参

window.sum.apply(obj, [3, 5]);

push

 var arr = [];arr.push(1);console.log(arr);

真数组转换伪数组的一个过程

1.通过[].push找到数组中的push方法
2.通过apply(obj)将找到的push方法内部的this修改为自定义的对象
3.将传入数组中的元素依次取出, 传递给形参

 var arr = [1, 3, 5, 7, 9];var obj = {};[].push.apply(obj, arr);console.log(obj);

// 系统自带的伪数组
var res = document.querySelectorAll("div");
// 自定义的伪数组
var obj = {0:"yjk", 1:"33", length: 2};var arr = []; // 真数组[].push.apply(arr, obj);console.log(arr);

slice

如果想将伪数组转换为真数组那么可以使用如下方法

var arr = [].slice.call(obj);console.log(arr);

如果slice方法什么参数都没有传递, 会将数组中的元素放到一个新的数组中原样返回

var arr2 = [1, 3, 5, 7, 9];var res2 = arr2.slice();              //1,3,5,7,9
var res2 = arr2.slice(2);            //5,7,9
var res2 = arr2.slice(2, 4);        // 5,7

apply&call的区别

共同之处:

都“可以用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由thisObj指定的新对象”。

不同之处:

apply:最多只能有两个参数——新this对象和一个数组argArray。如果给该方法传递多个参数,则把参数都写进这个数组里面,当然,即使只有一个参数,也要写进数组里。如果argArray不是一个有效的数组或arguments对象,那么将导致一个TypeError。如果没有提供argArray和thisObj任何一个参数,那么Global对象将被用作thisObj,并且无法被传递任何参数。

call:它可以接受多个参数,第一个参数与apply一样,后面则是一串参数列表。这个方法主要用在js对象各方法相互调用的时候,使当前this实例指针保持一致,或者在特殊情况下需要改变this指针。如果没有提供thisObj参数,那么 Global 对象被用作thisObj。

实际上,apply和call的功能是一样的,只是传入的参数列表形式不同。

Mr.J-- jQuery学习笔记(二十三)--applycall相关推荐

  1. 立创eda学习笔记二十三:如何将原理图和焊盘关联?(交叉选择)

    这是我在网上看到的一个提问,我对这个提问有两个理解, 1,如何显示原理图符号和PCB封装之间的对应位置关系? 那么可以使用以下的交叉选择功能. 这个功能是用来跳转原理图符号和PCB封装之间的对应位置. ...

  2. python学习笔记(二十三) -- 多进程和多线程

    目录 多线程多进程的意义 多进程的使用 方式一(fork):  只能在Unix/Linux/Mac系统下执行,windows不可以 方式二(multiprocessing.Process): 全平台通 ...

  3. IOS学习笔记二十三对象归档(NSKeyedArchiver、NSKeyedUnArchiver、NSCodeing)

    1.NSKeyedArchiver.NSKeyedUnArchiver 1).archiveRootObject:toFile 归档对象到这个路径文件 2).unarchiveObjectWithFi ...

  4. Java学习笔记(二十三)日志体系(logback)

    Java日志体系(logback) logback 简介 师出同门,与log4j一样,logback也是由Ceki Gülcü开发的开源日志组件,可以说是log4j的改进版:在现如今的项目中,logb ...

  5. Mr.J-- jQuery学习笔记(二十八)--DOM操作方法(添加方法总结)

    Table of Contents appendTo appendTo(source, target) 源代码 append prependTo ​ ​ ​ ​ prependTo源码 prepend ...

  6. Mr.J-- jQuery学习笔记(二十七)--DOM操作方法(删除获取文本)

    清除 <body> <button>调用remove</button> <div>我是div<p>我是段落</p> </d ...

  7. jQuery学习笔记:Ajax(二)

    接上篇"jQuery学习笔记:Ajax(一)". 3.jQuery.get(url,[data],[callback],[type])通过远程 HTTP GET 请求载入信息. 这 ...

  8. Mr.J-- jQuery学习笔记(二十一)--模拟微博页面

    先看之前的节点操作方法:Mr.J-- jQuery学习笔记(二十)--节点操作方法 Mr.J-- jQuery学习笔记(五)--属性及属性节点 Mr.J-- jQuery学习笔记(十一)--事件委托  ...

  9. jQuery学习笔记(二)

    jQuery学习笔记(二) 二.管理jQuery包装集 1.创建新的元素 使用HTML DOM 创建元素 var select=document.createElement("select& ...

最新文章

  1. 企业进销存管理系统_攻略 | 七巧Plus定制您的专属进销存管理系统
  2. 【错误记录】生成 Java 文档错误 ( Xxx.java:xx: 错误: 编码GBK的不可映射字符 )
  3. 关于网络流sap算法
  4. 殷浩详解DDD:如何避免写流水账代码?
  5. Arthas实践--获取到Spring Context,然后为所欲为
  6. php访问网页post获取源码,第一次抓别人网站数据,用postman直接请求可以获取到返回数据,通过代码的方式就一直报错,php...
  7. 字符串中的第一个唯一字符
  8. Linux 双网卡绑定方法
  9. android app 提高级别,android 关于提高第三方app的service优先级
  10. java postconstruct_java的@PostConstruct注解
  11. 用virtualenv建立独立虚拟环境 批量导入模块信息
  12. 深度:芸芸众司向AI进军路上的笑与泪
  13. http://www.cnblogs.com/qianmojing/p/6142178.html
  14. 微信android系统要求,系统设计要求
  15. Android学习记录
  16. py233基于 python的诚交大学生二手交易平台Django#毕业设计
  17. 铝电解电容和钽电容区别
  18. 怎么网络同步计算机的本地时间,VBA实现本地计算机时间与网服务器时间的同步...
  19. 本以为能躺着进华为,结果陆续收到京东/滴滴/爱奇艺offer的我迷茫了
  20. 魔兽争霸Trigger学习教程(0)

热门文章

  1. 666! 玩王者,识英雄,这样也能上顶会!
  2. 【大师分享】人工智能始发力,医学影像更清晰
  3. 5行Python 代码就能让你的电脑永不息屏
  4. 「Python基础知识」Python字符串是什么,如何使用
  5. 查阅 arXiv 论文新神器,一行代码比较版本差别,Github 新开源!
  6. 神经网络初始化trick:大神何凯明教你如何训练网络!
  7. C++编程积累——C++实现十进制与八进制之间的互相转换
  8. php狼和兔子算法,PHP基于递归算法解决兔子生兔子问题php技巧
  9. 通过shell访问hive_【HIVE】SHELL调用Hive查询
  10. paddleOCR常见问题(2)