call,apply,bind都是用来挟持对象或者说更改this指向的,但是区别还是有的,call 传参是 fn.call(this,1,2,3) apply传参是 fn.apply(this,[1,2,3])

而前两者是立即执行的,后者Bind是返回一个函数 var foo = fn.bind(this)  foo()

看到一个关于美团面试题是如何实现js bind

      if (typeof Function.prototype.bind === "undefined"){
Function.prototype.bind = function (thisArgs){
var fn = this,
slice = Array.prototype.slice,
args = slice.call(arguments, 1);//都是为了截取参数
return function (){
return fn.apply(thisArgs, args.concat(slice.call(arguments)));
}
}
}

代码来自书籍 《javaScript 模式》

其实结合上ES6可以更简洁:

Function.prototype.bind1 = function (thisArgs){
var fn = this,//foo
//arguments 是类数组,支持for循环,但不支持数组的方法
// args = [].slice.call(arguments, 1);//截取参数 5
args = Array.from(arguments).slice(1);//截取参数 5
return function (){
return fn.apply(thisArgs,args);
}
}
var m = {
"x" : 1
};
function foo(y) {
console.log(this.x + y);
}
// foo.apply(m, [5]);
// foo.call(m, 5);
var foo1 = foo.bind1(m,5);
foo1();

上面的return函数也换成箭头函数的话就更加简洁了。

Function.prototype.bind1 = function (thisArgs){
  args = Array.from(arguments).slice(1);//截取参数 5
  return ()=>this.apply(thisArgs,args)
}

箭头函数注意:只有一句的时候可以省略return,然后前面的fn也可以省略了。

  

  

 

最新文章

  1. javascript设计模式:策略模式
  2. C#_基础,初始化器
  3. Android IOS WebRTC 音视频开发总结(七七)-- WebRTC的架构和协议栈
  4. git 学习使用总结一(本地操作)
  5. C#高级特性_Attribute
  6. 系统配置 之:远程桌面连接(win7系统)
  7. 16进制字符串转换为3进制(扩展至K进制)
  8. Android ImageView的scaleType属性与adjustViewBounds属性
  9. Jquery 鼠标事件解析
  10. 获取表单的初始值,模拟placeholder属性
  11. nova 配置文件
  12. ###STL学习--适配器
  13. SDWebImage 原理及使用-b
  14. 最全最详细:ubuntu16.04下内核编译以及设备驱动程序的编写(针对新手而写)
  15. thinkphp5.0 分页中伪静态的处理
  16. PHPexcel(2)
  17. maven私库nexus2.3.0-04迁移升级到nexus-3.16.1-02(异机迁移备份)
  18. 大叔来说说Markdown的使用
  19. Java调用OCR进行图片识别
  20. FUzhou 1607 Greedy division---因子个数问题。

热门文章

  1. MVC页面简单post提交
  2. Sql Server 锁 排它锁 更新锁 共享锁
  3. 在MyEclipse中使用javadoc导出API文档详解
  4. 线程安全的Dictionary
  5. springboot 整合kafka
  6. linux服务器上创建svn版本库
  7. mysql四-1:单表查询
  8. Scrum之初体验
  9. css3 转换 过渡 及动画
  10. 使用putty远程登录Ubuntu时,报Network error:Connection refused错误