参考了这篇文章:http://www.tuicool.com/articles/EVF3Eb

给几个例子

function add(a,b)
{
alert(a+b);
}
function sub(a,b)
{
alert(a-b);
}
add.call(sub,,);

这个运行是什么呢?答案:

. 运行的是add.

因为call是运行的调用者。将第一个参数作为this参数来使用。

再来一个例子

function Animal(){
this.name = "Animal";
this.showName = function(){
console.log(this.name);
}
}
function Cat(){
this.name = "Cat";
}
var animal = new Animal();
var cat = new Cat(); animal.showName.call(cat,",");
或者
animal.showName.apply(cat,[]);

答案是:

Cat。 因为this换做了Cat。

另外,继承时候用来调用父类的构造函数:

function Animal(name){
this.name = name;
this.showName = function(){
console.log(this.name);
}
}
function Cat(name){
Animal.call(this, name);
}
var cat = new Cat("Black Cat");
cat.showName();

调用完父类之后,cat也有了showName的方法。

下面这两种调用基本等价:

myfunc.call(func,"var"," fun");
myfunc.apply(func,["var"," fun"]);

而关于bind:作用:改变了上下文的this

bind与call不同点有两个:

①bind的返回值是函数。

//使用bind是 返回改变上下文this后的函数

//使用call是 改变上下文this并执行函数

②后面的参数的使用也有区别

function f(a,b,c){
console.log(a,b,c);
} var f_Extend = f.bind(null,"extend_A")
f("A","B","C") //这里会输出--> A B C f_Extend("A","B","C") //这里会输出--> extend_A A B f_Extend("B","C") //这里会输出--> extend_A B C f.call(null,"extend_A") //这里会输出--> extend_A undefined undefined call 是 把第二个及以后的参数作为f方法的实参传进去 而bind 虽说也是获取第二个及以后的参数用于之后方法的执行,但是f_Extend中传入的实参则是在bind中传入参数的基础上往后排的。

所以,以下两个是等价的:

var f_Extend = f.bind(null,"extend_A")

//↓↓↓

var f_Extend = function(b,c){
return f.call(null,"extend_A",b,c);
}

有一个应用场景:

例如现在有一个方法 根据不同的文件类型进行相应的处理,通过bind 就可以创建出简化版的处理方法

function FileDealFunc(type,url,callback){
if(type=="txt"){...}
else if(type=="xml"){...}
.....
} var TxtDealFunc = FileDealFunc.bind(this,"txt");
//这样使用的时候更方便一些 FileDealFunc("txt",XXURL,func); //原来 TxtDealFunc(XXURL,func); //现在

对于旧的版本,可以用以下方式做兼容处理(EcmaScript5中扩展了叫bind的方法(IE6,7,8不支持))

if (!Function.prototype.bind) {
Function.prototype.bind = function(obj) {
var _self = this
,args = arguments;
return function() {
_self.apply(obj, Array.prototype.slice.call(args, ));
}
}
}

不过上面的函数,好像只接受了一个参数。

JS里面的call, apply以及bind的更多相关文章

  1. js里function的apply vs. bind vs. call

    js里除了直接调用obj.func()之外,还提供了另外3种调用方式:apply.bind.call,都在function的原型里.这3种方法的异同在stackoverflow的这个答案里说的最清楚, ...

  2. JS中call、apply、bind使用指南,带部分原理。

    为什么需要这些?主要是因为this,来看看this干的好事. box.onclick = function(){ function fn(){ alert(this); } fn();}; 我们原本以 ...

  3. js中call、apply、bind那些事

    前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如- 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...

  4. js中call、apply、bind那些事2

    前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如… 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...

  5. JS中call()和apply()以及bind()的区别

    一.方法定义: apply:调用一个对象的一个方法,用另一个对象替换当前对象.例如:B.apply(A, arguments);即A对象应用B对象的方法. call:调用一个对象的一个方法,用另一个对 ...

  6. JS中call()、apply()、bind()的用法

    其实是一个很简单的东西,认真看十分钟就从一脸懵B 到完全 理解! 先看明白下面: 例1 obj.objAge;  //17 obj.myFun()  //小张年龄undefined 例2 shows( ...

  7. 深入理解js里面的this

    闲聊两句(可以忽略): 毕业有半年了,时间还过得真快,不过还好,感觉自己相对于刚毕业那会确实成长了很多:好久没有打游戏了(自己决心要戒掉的),消磨时光的时候就看看电影或者追追电视剧,再无聊就洗洗衣服. ...

  8. js中call、apply和bind到底有什么区别?

    介绍 在js中,每个函数的原型都指向Function.prototype对象(js基于原型链的继承).因此,每个函数都会有apply,call,和bind方法,这些方法继承于Function. 它们的 ...

  9. js里面的Object基本

    属性名必须是字符串,非字符串对象不能用来作为一个对象属性的键,任何非字符串对象,包括number,可通过toString()方法,类型转换成一个字符串1 1,Object基本格式 <script ...

随机推荐

  1. 用PHP写的一个简单的分页类 2.0版

    <?php /* 分页类 用于实现对多条数据分页显示 version:2.0 //基于1.0 数据库查询用mysqli实现 author:Knight E-Mail:S.Knight.Work@ ...

  2. 06-python进阶-多线程下载器练手

    我们需要用python 写一个多线程的下载器 我们要先获取这个文件的大小 然后将其分片 然后启动多线程 分别去下载 然后将其拼接起来 #!/usr/bin/env python#coding:utf- ...

  3. wordpress 获取站点的所有链接

    <?php include "wp-load.php"; $posts = new WP_Query('post_type=any&posts_per_page=-1 ...

  4. linux 基础 软件的安装 *****

    一软件的安装   原代码与tarball 源代码---->编译------>可执行文件 查看文件类型   file命令    是否是二进制文件 注意如果文件的可执行权限 .c结尾的源文件- ...

  5. Thinkphp5.1源码阅读

    主要流程 1 \public\index.php require __DIR__ . '/../thinkphp/start.php'; \thinkphp\start.php require __D ...

  6. Bootstrap-datepicker 用法

    <div class="input-group input-daterange"> <input type="text" id="s ...

  7. RobotFramwork自定义库

    这么长时间才知道有RobotFramwork这东西... 感叹之前都干啥去了,感叹公司为啥不用这货? 网上的安装文档都有,就不用自己在记录啦. 感觉在实际实用时,肯定要有自己定义的库啊,不能只用bui ...

  8. 关于sql语句实现将'1,2,3'转1,2,3等竖横转换问题

    这是本人的第一个博客,以后会及时整理遇到的问题,方便和大家进行交流. 第一次也不知道说什么了,直接进入正题吧. 因为我的数据在设计时候数据源是竖列存的,满足条件的数据是横列存的.如下图所示: 我要筛选 ...

  9. BaseResponse

    package common; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; /** * ...

  10. linux监控平台搭建-cpu

    linux监控平台搭建-cpu 目前服务器的主流CPU是intel或者AMD.到底主频是什么.多核.多线程.并发.并行.超频.一级缓存.二级缓存.三级缓存.i386.x86 cpu:含有算术逻辑.控制 ...