一直感觉代码中有call和apply就很高大上(看不懂),但是都草草略过,今天非要弄明白!
以前总是死记硬背:call、apply、bind 都是用来修改函数中的this,传参时,call是一个个传参,apply是数组或者类数组形式传参,call和apply立即执行并且返回值是你调用的方法的返回值,若该方法没有返回值,则返回undefined。bind是改变this后返回一个新的函数,他不会立即执行。
死记硬背的结果就是:总以为这三个方法改变了原方法的this,原方法的this就永久改变了!大错特错啊!!
1.提出问题:看到好多call使用场景,就是不求甚解!
例1:Object.prototype.toString.call(arguments) 用来精确判断数据类型:"[object Array]" 或者 "[object Object]"
例2:Array.slice.call(类数组) 或者 [].slice.call(类数组) 用来把类数组转为数组,其实这里就是让类数组使用一下不属于自己的方法slice 2.验证问题:看看apply的用法 (别人写的)
function people(age,sex){
this.age=age;
this.sex=sex;
};
function adult(age,sex){
people.apply(this,arguments)
};
var jack = new adult(18,'man');
console.log(jack.age+":"+jack.sex)
输出为 18:man
其实看到这段代码就知道apply怎么用了吧。
其实apply说到底就是为了使一个对象可以使用不属于自己的方法,
3. 扩展(填坑之路):我想自己写一下验证apply会不会改变this,如下(自己写的)
function fn() {
console.log(this);
}
var obj={a:[4,5,6],b:[7,8]};
fn.apply(obj); // {a: Array(3), b: Array(2)}
var f=new fn(); // { }
     郁闷:倒数第二行我不是用fn.apply(obj)改了fn的this指向为obj了么,为什么最后一行new出来的对象是空的?不应该是带a和b属性么?
答案:你只是用fn.apply(obj)执行了一把fn,执行时顺便把fn中的this改成了obj而已,然后把结果输出,这并不会改变fn原函数啊。
     否则调用一次 Array.slice.call(类数组) ,难道就要把数组的slice方法里的this永久修改为传入的参数 类数组 么!那不是疯了么!
以后这样死记硬背:call、apply、bind 是Function.prototype下的方法,作用是执行一下目标函数,执行时顺便把目标函数中的this改一下,然后把结果输出,执行后,不会影响原函数!
题外话:如果你的代码也想用这三个方法,你就要学习数组的slice写法,里面的逻辑都考虑到this问题。

最新文章

  1. IT这一行,如可高速下载国外资源之迅雷设置免费SSH代理下载国外资源
  2. vs2012 安装entity framework
  3. (转)px、em、rem的区别和使用
  4. C++之路进阶——优先队列优化最短路径算法(dijkstra)
  5. 三 JSP 技术
  6. PIL不能关闭文件的解决方案
  7. Error Code: 1175 Mysql中更新或删除时报错(未带关键字条件)
  8. Oracle “CONNECT BY” 使用
  9. ORACLE 解析xml字符串-转载的
  10. CentOS安装错误:no default or ui configuration
  11. Binder的非正常消亡时的重置方法
  12. 第8章 动态客户端注册 - IdentityModel 中文文档(v1.0.0)
  13. (ecj)Eclipse的Java编译器分析之一——ecj介绍
  14. XML中DTD,XSD的区别与应用
  15. 读取txt文件赋值到DataGridView中
  16. jmeter 签名MD5生成
  17. 使用yum安装php72
  18. 【Java】代理模式,静态代理和动态代理(基于JDK或CGLib)
  19. 一起来做chrome扩展《页面右键菜单》
  20. Linux I/O缓冲

热门文章

  1. OpenJudge计算概论-自整除数
  2. Bitmap添加水印效果
  3. 运维之利器--Ansible
  4. 动态PHP电商网站伪静态的 Nginx反向代理Cache缓存终极设置
  5. JQ操作select项
  6. Python扫描器-HTTP协议
  7. python多进程——fork()
  8. Azure AADSTS7000215 其中一种问题的解决
  9. YIIMP矿池搭建
  10. 人工神经网络反向传播算法(BP算法)证明推导