call、apply和bind的用法
在改变 this 指向的时候,经常会把这三个方法混淆,下面就详细的整理一下三者的用法和区别
call() 方法
- call() 方法可以有无数个参数
- 第一个参数是改变 this 指向的对象
- 后面的参数直接传递给函数的自身
- 使用后会自动执行
var a = {
name: '张三'
}
var b = {
name: '李四',
sayName: function (a,b,c) {
console.log(this.name, a+b+c)
}
}
b.sayName.call(a, 1,2,3)
// 输出 --> 张三 6
apply() 方法
- apply() 方法只能由两个参数
- 第一个参数是改变 this 指向的对象
- 第二个参数必须是一个数组
- 使用后会自动执行
var a = {
name: '张三'
}
var b = {
name: '李四',
sayName: function (a,b,c) {
console.log(this.name, a+b+c)
}
}
var arr = [1,2,3]
b.sayName.apply(a,arr)
// 输出 --> 张三 6
bind() 方法
- bind() 方法可以有无数个参数
- 第一个参数是改变 this 指向的对象
- 后面的参数直接传递给函数的自身
- 使用后不会自动执行,会返回一个新函数
var a = {
name: '张三'
}
var b = {
name: '李四',
sayName: function (a,b,c) {
console.log(this.name, a+b+c)
}
}
var c = b.sayName.bind(a,1,2,3)
// 需手动调用新函数 c 才会执行
c()
// 输出 --> 张三 6
三个方法的共同点
- 第一个参数都为改变this指向的对象
- 在非严格模式下,若第一参数为
null/undefined,this默认指向window - 在严格模式下,若第一参数为
null/undefined,this默认指向undefined
三个方法的区别
这里用一个表格来展示吧,可能看起来要稍微直观点
| 方法名 | 可含参数个数 | 是否自动执行 |
|---|---|---|
| call | 无数个 | 是 |
| appy | 两个,第二个必须为数组 | 是 |
| bind | 无数个 | 否,会返回一个新函数 |
call、apply和bind的用法的更多相关文章
- js中call、apply、bind的用法
原文链接:http://www.cnblogs.com/xljzlw/p/3775162.html var zlw = { name: "zlw", sayHello: funct ...
- call、apply、bind的用法
数组追加 //用apply拼接 var arr1=[12,'name:foo',2048]; var arr2=['Joe','Hello']; Array.prototype.push.apply( ...
- javascript中call()、apply()、bind()的用法理解
一.bind的用法 第一个:obj.showInfo('arg','arg_18');中传的2个参数通过showInfo方法改变的是obj下中的name和age 第二个:obj.showInfo.bi ...
- JS中的call()、apply() 以及 bind()方法用法总结
JS中的call()方法和apply()方法用法总结 : 讲解: 调用函数,等于设置函数体内this对象的值,以扩充函数赖以运行的作用域. function add(c,d){ return thi ...
- javascript中call()、apply()、bind()的用法终于理解
其实是一个很简单的东西,认真看十分钟就从一脸懵B 到完全 理解! 先看明白下面: 例1 obj.objAge; //17 obj.myFun() //小张年龄undefined 例2 shows( ...
- call,apply,bind的用法与区别
1.call/apply/bind方法的来源 首先,在使用call,apply,bind方法时,我们有必要知道这三个方法究竟是来自哪里?为什么可以使用的到这三个方法? call,apply,bind这 ...
- (转)javascript中call()、apply()、bind()的用法
其实是一个很简单的东西,认真看十分钟就从一脸懵B 到完全 理解! 先看明白下面: 例1 obj.objAge; //17 obj.myFun() //小张年龄undefined 例2 shows( ...
- <JavaScript> call()、apply()、bind() 的用法
其实是一个很简单的东西,认真看十分钟就从一脸懵B 到完全 理解! 先看明白下面: 例 1 obj.objAge; obj.myFun() // 小张年龄 undefined 例 2 shows() ...
- call、apply、bind 的用法
例1 obj.objAge; //17 obj.myFun() //小张年龄undefined 例2 shows() //盲僧 比较一下这两者this 的差别,第一个打印里面的this 指向obj,第 ...
- JS中call()、apply()、bind()的用法
其实是一个很简单的东西,认真看十分钟就从一脸懵B 到完全 理解! 先看明白下面: 例1 obj.objAge; //17 obj.myFun() //小张年龄undefined 例2 shows( ...
随机推荐
- Ling之select
select用法: 1.Dictionary<string, string>转json Newtonsoft.Json.JsonConvert.SerializeObject(dicSub ...
- 多线程篇七:通过Callable和Future获取线程池中单个务完成后的结果
使用场景:如果需要拿到线程的结果,或者在线程完成后做其他操作,可以使用Callable 和 Futrue 1.定义一个线程池,向线程池中提交单个callable任务 ExecutorService t ...
- iframe中插入代码并执行
最近有需求通过iframe插入代码.有蛮多方法,如下: 1 var iframe = document.getElementById('previewUrl'); 2 iframe.src = 'ab ...
- (转)原生ajax的写法
1.创建XMLHttpRequest对象 function createXMLHTTPRequest() { //1.创建XMLHttpRequest对象 //这是XMLHttpReuquest对象无 ...
- iOS中使用RNCryptor对资源文件加密
原文:http://blog.csdn.net/chenpolu/article/details/46277587 RNCryptor源码https://github.com/RNCryptor/RN ...
- microkernel architecture - Proxy
The microkernel architecture pattern allows you to add additional application features as plug-ins t ...
- AngularJs整合ui-bootstrap以及ui-grid
1. ui-bootstrap 参考博客: http://www.cnblogs.com/pilixiami/p/5597634.html (这篇博客写的非常不错,值得推荐) angular-ui ...
- 用Webstorm 运行React-native 工程时,出错:xcrun: error: unable to find utility "instruments", not a developer tool or in PATH
解决方法:在 终端执行如下命令 sudo xcode-select -s /Applications/Xcode.app/Contents/Developer/ 注意:前提是你已经安装了xcode
- Python——追加学习笔记(四)
函数 1.python里的函数可以返回一个值或者对象,知识在返回一个容器对象的时候有点不同,看起来像是能返回多个对象. >>> def bar(): ... return 'abc' ...
- CentOS 7.3 下 Mysql(mariadb)的安装
LNMP的安装中 Nginx的安装很简单,我一般去Nginx官方网站上下载对应版本的rpm包后,上传到终端rpm安装.再此不多赘述. 但是在CentOS7中安装最新的mysql(mariadb)却经常 ...