js 中call,apply,bind的区别
call、apply、bind方法的共同点与区别:
apply、call、bind 三者都是用来改变函数的this对象的指向;
apply、call、bind 三者都可以利用后续参数传参;
bind 是返回对应函数,便于稍后调用;apply、call则是立即调用。
一、call
1、 call(thisObj,x,y)
thisObj的取值有以下4种情况:
(1)不传,或者传null,undefined,函数中的this指向window对象;
(2)传递另一个函数的函数名,函数中的this指向这个函数的引用;
(3)传递字符串、数值或者布尔类型等基础类型,函数中的this指向其对应的包装对象,如string、number、boolean
(4) 传递一个对象,函数中的this指向这个对象
function a(){
console.log(this);
}
function b(){}
var c={name: 'call'};
a.call(); // window
a.call(null); //window
a.call(undefined) //window
a.call(1); // Number
a.call(''); // String
a.call(true) // Boolean
a.call(b) // function b(){}
a.call(c) // Object
2、 举个例子:
function Animal(){
this.name="animal";
this.showName=function(){
console.log(this.name);
}
}
function Dog(){
this.name = "dog";
}
var animal=new Animal();
var dog = new Dog();
animal.showName.call(dog);
返回的是dog
因为dog继承了animal中showName 这个方法,但是this的指向还是dog,所有打印出来的是dog 中的name.
3、 call()在继承中的运用
function Animal(name) {
this.name=name;
this.showName=function(){
console.log(this.name);
}
}
function Dog(name){
Animal.call(this,name);
}
var dog = new Dog("Crazy dog");
dog.showName();
}
输出:Crazy dog
传入了name 这个参数。
二、apply()
apply(thisObj,[argArray])
如果argArray 不是一个有效的数组或者不是arguments对象,那么将导致一个TypeError。
如果没有提供argArray 和thisObj 任何一个参数,那么Global对象将被用作thisObj, 并且无法被传递任何参数。
call 与apply 用法几乎是一样,只是传参的方式不一样。在js中,如果某个参数数量是不固定的,适合用apply,可以把参数push 进数组,传递进去。如果参数的数量是明确的,那就可以用cal。
三、bind
1、bind是在ES5 中扩展的方法(IE6,7,8不支持)
bind()方法与apply 和call很相似,也是可以改变函数体内的this的指向。
MDN的解释是:bind()方法会创建一个新函数,称为绑定函数,当调用这个绑定函数时,绑定函数会以创建它时传入bind()方法的第一个参数作为this,传入bind()方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数。
var bar=function(){
console.log(this.x)
}
var foo={
x:3
}
bar()
bar.bind(foo)();
var func=bar.bind(foo);
func()
输出:
undefined
3
2、如果连续bind()两次,艺或者是连续bind()三次,那么输出的值是什么?
var bar = function(){
console.log(this.x)
}
var foo = {
x:3
}
var sed = {
x:4
}
var func = bar.bind(foo).bind(sed);
func();//
var fiv = {
x:5
}
var func = bar.bind(foo).bind(sed).bind(fiv);
func();
答案都是3。原因是,在js中,多次bind()是无效的。
四、总结apply、call、bind比较
var obj = {
x: 81
}
var foo = {
getX: function() {
return this.x;
}
}
console.log(foo.getX.bind(obj)()); //
console.log(foo.getX.call(obj)); //
console.log(foo.getX.apply(obj)); //
三个输出是81,但是注意看使用bind()方法,后面多了对括号。
区别是:当你希望改变上下文环境之后并非立即执行,而是回调执行的时候,使用bind()方法。而apply/call则会立即执行函数。
再总结一下:
apply、call、bind 三者都是用来改变函数的this对象的指向的;
apply、call、bind 三者第一个参数都是this要指向的对象,也就是想指定的上下文;
apply、call、bind 三者都可以利用后续参数传参;
bind是返回对应函数,便于稍后调用;apply、call则是立即调用。
js 中call,apply,bind的区别的更多相关文章
- JS中call,apply,bind的区别
1.关于this对象的指向,请看如下代码 var name = 'jack'; var age = 18; var obj = { name:'mary', objAge:this.age, myFu ...
- JS中call,apply,bind方法的总结
why?call,apply,bind干什么的?为什么要学这个? 一般用来指定this的环境,在没有学之前,通常会有这些问题. var a = { user: "小马扎", fn: ...
- 深入理解js中的apply、call、bind
概述 js中的apply,call都是为了改变某个函数运行时的上下文环境而存在的,即改变函数内部的this指向. apply() apply 方法传入两个参数:一个是作为函数上下文的对象,另外一个是作 ...
- JS 的 call apply bind 方法
js的call apply bind 方法都很常见,目的都是为了改变某个方法的执行环境(context) call call([thisObj[,arg1[, arg2[, [,.argN]]]] ...
- javascript中call,apply,bind的用法对比分析
这篇文章主要给大家对比分析了javascript中call,apply,bind三个函数的用法,非常的详细,这里推荐给小伙伴们. 关于call,apply,bind这三个函数的用法,是学习java ...
- JS中isPrototypeOf 和hasOwnProperty 的区别 ------- js使用in和hasOwnProperty获取对象属性的区别
JS中isPrototypeOf 和hasOwnProperty 的区别 1.isPrototypeOf isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的 ...
- (网页)Angular.js 中 copy 赋值与 = 赋值 区别
转自st.gg Angular.js 中 copy 赋值与 = 赋值 区别 为什么用 $scope.user = $scope.master; $scope.master 会跟着 $scope.use ...
- js中的substr和substring区别
js中的substr和substring区别 Substring: 该方法可以有一个参数也可以有两个参数. (1) 一个参数: 示例: var str=“Olive”: str.substring( ...
- JS 中的require 和 import 区别整理
ES6标准发布后,module成为标准,标准的使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们采用的是CommonJS规范,使用require引入模块,使 ...
随机推荐
- Spring JdbcTemplate操作小结
Spring 提供了JdbcTemplate 来封装数据库jdbc操作细节: 包括: 数据库连接[打开/关闭] ,异常转义 ,SQL执行 ,查询结果的转换 使用模板方式封装 jdbc数据库操作-固定流 ...
- 洛谷 [P1290] 欧几里得的游戏
SG函数的应用 看到这题就想到了SG函数 那么可以考虑最终情况:一个数是x,另一个是0,那么先手必败(因为上一个人已经得到0了,其实游戏已经结束了) 剩下的情况:一个数n, 一个数m,假设n>m ...
- JSP表单提交中文乱码
简要笔记:由于jsp默认表单提交编码方式是:ISO-8859-1,而我们需要的是utf-8或者是gbk码,故需要转化. 具体方法是:在表单处理文件中,将获取到的变量进行转换. String userN ...
- HBASE的安装过程及运行HBASE程序的需要配置的内容
HBase安装配置 ①下载压缩包(选择与自己安装的Hadoop版本的兼容版本,见后面附录) 官网下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/hba ...
- Spring Tool Suite (STS) 安装SVN插件
今天STS安装SVN时遇到很多问题,度娘搜索几个小时才安装成功. 在此记录下安装过程. 我的 STS版本: 安装SVN有两种方式: 方法1:依次选择help->preferences->e ...
- 服务器Out of Memory
之前有次把图片存储在数据库,结果读取时候报错了:Out of Memory.. 图片本来不应该存储在数据库中的,消耗内存太大,既然已经这样,那就先解决问题,不改存储方式. 如果一个应用程序为了提高性能 ...
- Obj-C, library with ARC code and warning - Method possibly missing a [super dealloc] call?
1 down vote favorite I'm adding the MKStoreKit to my app and I'm getting a warning, Method possibly ...
- Go -- go语言指针
package main import "fmt" type Test struct { Name string } func change2(t *Test) { t.Name ...
- easyui datagrid client搜索、分页、排序
easyui datagrid的排序默认是server端排序.能够用sorter实现client排序[2].client分页可用filter实现[3].client搜索相同能够用filter实现. 不 ...
- 查询mysql字段名和字段注释
select COLUMN_NAME,column_comment from INFORMATION_SCHEMA.Columns where table_name='表名' and table_sc ...