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引入模块,使 ...
随机推荐
- 【leetcode最短路】818. Race Car
https://leetcode.com/problems/race-car/description/ 1. BFS剪枝 0<=current position<=2*target.为什么 ...
- 转 CListCtrl::InsertColumn、InsertItem、SetItemText;
将数据写入到CListCtrl 向CListCtrl中写入数据,一般使用3个成员方法: CListCtrl::InsertColumn; CListCtrl::InsertItem; CListCtr ...
- ifame标签
一 w3c网址 http://www.w3school.com.cn/tags/tag_iframe.asp 二 iframe 元素会创建包含另外一个文档的内联框架(即行内框架). 三 页面显示及代码 ...
- Hubtown
Hubtown 时间限制: 10 Sec 内存限制: 256 MB 题目描述 Hubtown is a large Nordic city which is home to n citizens. ...
- uva 11178二维几何(点与直线、点积叉积)
Problem D Morley’s Theorem Input: Standard Input Output: Standard Output Morley’s theorem states tha ...
- 【Tyvj1982】武器分配(费用流)
题意:有N个人要从A个物品中各取一个,B个物品中各取一个,选取第i个A类物品和第j个B类物品的费用是(a[i]-b[j])^2 求最小总花费 n<=a,b<=80 a[i],b[i]< ...
- 【Tomcat】linux下实时查看tomcat运行日志
今天在部署一个项目到linux服务器的时候一直报错,可是在日志文件中也没有记录.但是在本地测试的时候都没有错误,在windoesServer服务器上也没错误,实在找不到原因,因此想的实时查看tomca ...
- 问题:typedef char *pstring????
typedef char *pstring; const pstring cstr = 0; //cstr是指向char的常量指针: const pstring *ps; //ps是一个指针,它的对象 ...
- mysql修改删除列,删除有外键依赖的列
–重命名表rename table t_softwareport to software_port; –建立外键alter table software_port add constraint fk_ ...
- 静态NAT、动态NAT、PAT(端口多路复用)的配置
静态NAT.动态NAT.PAT(端口多路复用)的配置 NAT的实现方式有三种,即静态转换Static Nat.动态转换Dynamic Nat 和 端口多路复用OverLoad. 静态转换 ( ...