JavaScript 中 call()、apply()、bind() 的用法

之前对与JavaScript中的call,apply,bind这几个方法一直理解的很模糊,今天总结一下。

例1

 var name = '小王',
age = 20;
var obj = {
name: '小张',
objAge: this.name,
func: function () {
console.log(this.name + '年龄' + this.name);
}
}
 obj.objAge;  // 17
 obj.myFun() // 小张年龄 undefined

例2

var favorite = '李青';

function shows(){
console.log(this.fav);
}
shows()  //李青

比较一下这两者 this 的差别,第一个打印里面的 this 指向 obj,第二个全局声明的 shows() 函数 this 是 window ;

1,call()、apply()、bind() 都是用来重定义 this 这个对象的

var name ='小王',
  age = 17;
var obj = {
  name: '小张',
objAge: this.age,
  func: function () {
console.log(this.name + '年龄' + this.age);
}
}
var db = {
  name:'小李',
  age:'30'
}
obj.myFun.call(db);    // 小李年龄 30
obj.myFun.apply(db);    // 小李年龄 30
obj.myFun.bind(db)();   // 小李年龄 30
 

以上出了 bind 方法后面多了个 () 外 ,结果返回都一致!

由此得出结论,bind 返回的是一个新的函数,你必须调用它才会被执行。

2,对比call 、bind 、 apply 传参情况下

var name ='小王',
  age = 17;
var obj = {
  name: '小张',
objAge: this.age,
  func: function (from,place) {
console.log(this.name + '年龄' + this.age + '来自' + from + '去到' +place);
}
}
var db = {
  name:'小李',
  age:'30'
}
obj.myFun.call(db,'成都','上海');     // 小李 年龄 30   来自 成都去往上海
obj.myFun.apply(db,['成都','上海']); // 小李 年龄 30 来自 成都去往上海
obj.myFun.bind(db,'成都','上海')(); // 小李 年龄 30 来自 成都去往上海
obj.myFun.bind(db,['成都','上海'])();   // 小李 年龄 30 来自 成都,上海去往 undefined

微妙的差距!

从上面四个结果不难看出:

call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数差别就来了:

call 的参数是直接放进去的,第二第三第 n 个参数全都用逗号分隔,直接放到后面 obj.myFun.call(db,'成都', ... ,'string' )。

apply 的所有参数都必须放在一个数组里面传进去 obj.myFun.apply(db,['成都', ..., 'string' ])。

bind 除了返回是函数以外,它 的参数和 call 一样。

当然,三者的参数不限定是 string 类型,允许是各种类型,包括函数 、 object 等等!

最新文章

  1. 【笔记4】用pandas实现条目数据格式的推荐算法 (基于用户的协同)
  2. Web Scraping with Python读书笔记及思考
  3. 百度编辑器UEditor ASP.NET示例Demo 分类: ASP.NET 2015-01-12 11:18 346人阅读 评论(0) 收藏
  4. 浅谈Entity Framework 增删改查和事务操作
  5. iOS 如何适配iOS10
  6. rails provide与content_for的区别
  7. JQuery获取和设置Select选项常用方法总结
  8. 不要温柔地走入promise
  9. 使用Yeoman搭建 AngularJS 应用 (5) —— 让我们搭建一个网页应用
  10. 自己写的demo。List<HashMap<String,Object>>=new ArrayList<HashMap<String,Object>>
  11. Android Gradle 配置选项合集
  12. Python 直接赋值、浅拷贝和深度拷贝全解析
  13. openstack ocata版本简化安装
  14. Coding theano under remote ubuntu server from local Mac (在本地mac机器上,写、跑、调试、看-远程ubuntu上的theano代码)
  15. entityVo对象与entity对象
  16. Linux PCI设备驱动的实现思路与思想
  17. Android后台监控指定app的输入内容,抢红包,模拟点击原理
  18. mysql -- 慢日志使用
  19. ARMCortex系列仿真调试器
  20. JavaScript(ES5)知识点梳理

热门文章

  1. linux运维、架构之路-xtrabackup
  2. 2017乌鲁木齐网络赛 J题 Our Journey of Dalian Ends ( 最小费用最大流 )
  3. 清北学堂算法&&数据结构DAY1——知识整理
  4. border、outline、boxshadow那些事
  5. Springboot-H2DB
  6. React-Native 之 GD (八)GET 网络请求封装
  7. 洛谷P4317 花(fa)神的数论题(数位dp解法)
  8. C\C++语言中的宏多重展开和递归展开
  9. 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第5节 String类_7_字符串的转换相关方法
  10. free pascal 修改字符集,会导致 dos 不能显示 汉字。 处理方法如下