对于call,apply,bind 的理解
2024-09-05 23:08:06
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 等等!
最新文章
- 【笔记4】用pandas实现条目数据格式的推荐算法 (基于用户的协同)
- Web Scraping with Python读书笔记及思考
- 百度编辑器UEditor ASP.NET示例Demo 分类: ASP.NET 2015-01-12 11:18 346人阅读 评论(0) 收藏
- 浅谈Entity Framework 增删改查和事务操作
- iOS 如何适配iOS10
- rails provide与content_for的区别
- JQuery获取和设置Select选项常用方法总结
- 不要温柔地走入promise
- 使用Yeoman搭建 AngularJS 应用 (5) —— 让我们搭建一个网页应用
- 自己写的demo。List<;HashMap<;String,Object>;>;=new ArrayList<;HashMap<;String,Object>;>;
- Android Gradle 配置选项合集
- Python 直接赋值、浅拷贝和深度拷贝全解析
- openstack ocata版本简化安装
- Coding theano under remote ubuntu server from local Mac (在本地mac机器上,写、跑、调试、看-远程ubuntu上的theano代码)
- entityVo对象与entity对象
- Linux PCI设备驱动的实现思路与思想
- Android后台监控指定app的输入内容,抢红包,模拟点击原理
- mysql -- 慢日志使用
- ARMCortex系列仿真调试器
- JavaScript(ES5)知识点梳理
热门文章
- linux运维、架构之路-xtrabackup
- 2017乌鲁木齐网络赛 J题 Our Journey of Dalian Ends ( 最小费用最大流 )
- 清北学堂算法&;&;数据结构DAY1——知识整理
- border、outline、boxshadow那些事
- Springboot-H2DB
- React-Native 之 GD (八)GET 网络请求封装
- 洛谷P4317 花(fa)神的数论题(数位dp解法)
- C\C++语言中的宏多重展开和递归展开
- 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第5节 String类_7_字符串的转换相关方法
- free pascal 修改字符集,会导致 dos 不能显示 汉字。 处理方法如下