作用都是一样的,官方解释:“调用一个对象的一个方法,以另一个对象替换当前对象”, 简单来说就是改变当前使用该方法的对象中的this指向;

var xw = {
name : "小王",
gender : "男",
age : 24,
say : function() {
alert(this.name + " , " + this.gender + " ,今年" + this.age);
}
}
var xh = {
name : "小红",
gender : "女",
age : 12
}
xw.say.call(xh);//小红,女,今年12
xw.say.apply(xh);//小红,女,今年12
xw.say.bind(xh);//function(){alert(this.name+","+this.gender+",今年"+this.age);
xw.say.bind(xh)();//小红,女,今年12

call和apply都是对函数的直接调用,而bind方法返回的仍然是一个函数,因此后面还需要()来进行调用才可以。

var xw = {
    name : "小王",
    gender : "男",
    age : 24,
    say : function(school,grade) {
      alert(this.name + " , " + this.gender + " ,今年" + this.age + " ,在" + school + "上" + grade);
    }
     }
var xh = {
    name : "小红",
    gender : "女",
    age : 12
     }
xw.say.call(xh,"实验小学","六年级");//小红,女,今年12,在实验小学上六年级
xw.say.apply(xh,["实验小学","六年级"]);//小红,女,今年12,在实验小学上六年级
xw.say.bind(xh,"实验小学","六年级");//function(){alert(this.name+","+this.gender+",今年"+this.age+",在"+school+"上"+grade);
xw.say.bind(xh,"实验小学","六年级")();//小红,女,今年12,在实验小学上六年级
xw.say.bind(xh)("实验小学","六年级");//小红女今年12在实验小学上六年级 在调用的时候再进行传参

第一个参数添加要把参数添加到哪个环境中,简单来说,this就会指向那个对象。apply的第二个参数必须是一个数组;

call和apply都是改变this并立即执行这个函数,bind方法可以让对应的函数想什么时候调用就什么时候调用,并且可以将参数在执行的时候添加,这是它们的区别

特殊用法:

function A(a){
console.log(a);
}; function AA(a){
A.apply(this, arguments);
} AA("output in AA"); //output in AA this指A,arguments指a,也就是传入的参数
var a = {
user:"追梦子",
fn:function(){
console.log(this);//Window {external: Object, chrome: Object, document: document, g_blnCheckUnload: true, blogEditor: Object…}
}
}
var b = a.fn;
b.apply(null);

注意:如果call和apply的第一个参数写的是null,那么this指向的是window对象

call ,apply 和 bind的用法与区别的更多相关文章

  1. call,apply,bind的用法与区别

    1.call/apply/bind方法的来源 首先,在使用call,apply,bind方法时,我们有必要知道这三个方法究竟是来自哪里?为什么可以使用的到这三个方法? call,apply,bind这 ...

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

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

  3. js中call、apply、bind的用法

    原文链接:http://www.cnblogs.com/xljzlw/p/3775162.html var zlw = { name: "zlw", sayHello: funct ...

  4. call、apply、bind的用法

    数组追加 //用apply拼接 var arr1=[12,'name:foo',2048]; var arr2=['Joe','Hello']; Array.prototype.push.apply( ...

  5. javascript中call()、apply()、bind()的用法理解

    一.bind的用法 第一个:obj.showInfo('arg','arg_18');中传的2个参数通过showInfo方法改变的是obj下中的name和age 第二个:obj.showInfo.bi ...

  6. js中call、apply、bind到底有什么区别?bind返回的方法还能修改this指向吗?

     壹 ❀ 引 同事最近在看angularjs源码,被源码中各种bind,apply弄的晕头转向:于是他问我,你知道apply,call与bind的区别吗?我说apply与call是函数应用,指定thi ...

  7. 让你弄懂 call、apply、bind的应用和区别

    call.apply.bind使用和区别 // 有只猫叫小黑,小黑会吃鱼 const cat = { name: '小黑', eatFish(...args) { console.log('this指 ...

  8. JS中的call()、apply() 以及 bind()方法用法总结

    JS中的call()方法和apply()方法用法总结  : 讲解: 调用函数,等于设置函数体内this对象的值,以扩充函数赖以运行的作用域. function add(c,d){ return thi ...

  9. 使用call、apply、bind继承及三者区别

    js里的继承方法有很多,比如:使用原型链的组合继承.es6的Class.寄生继承以及使用call.apply.bind继承.再说继承之前,我们先简单了解下它们的区别. 一.区别: 同:三者都是改变函数 ...

随机推荐

  1. 关于去除input type='file'改变组件的默认样式换成自己需要的样式的解决方案

    在工作中时常会遇到如需要上传功能的按钮,而不像需要系统默认的样式时候,可以采取以下的解决方案: <img onclick="getElementById('file').click() ...

  2. MyEclipse2014拷贝web工程

    z哎myeclipse2014中,复制web项目 Ctrl+C复制原项目Ctrl+V粘贴并输入新的项目名称项目名 ---> 右键 ---> propertes ---> MyEcli ...

  3. extjs中,datefield日期,点击输入框弹出日期,禁止手动输入

    之前用readonly:true连日期也选不了了,editable:false也不行,最后用事件监听实现 栗子如下: { xtype: 'datefield', fieldLabel: '创建结束时间 ...

  4. cmake+qt+qtcreator的配置,解决Q_OBJECT的问题

    1.如果在编译qt项目的时候,一般头文件里都有Q_OBJECT,但是用cmake来编译的时候,就会报错,那么怎么解决呢? 解决的办法就是要在cmake里面写好配置 命令,再编译的时候,就不会报错了,写 ...

  5. 用SqlBulkCopy批量插入数据到SqlServer数据库表中

    首先创建一个数据库连接类:SQLHelper using System; using System.Collections.Generic; using System.Linq; using Syst ...

  6. 万恶的tileMap

    先吐槽下.. 本来,我们准备用tileMap来做地图的,但发现一个问题,就是tileMap层中不能添加cc.Sprite,这导致了tileMap只适合做2D平面没有遮挡的游戏,并且主角是不能有效率的进 ...

  7. js构造函数的完美继承(欢迎吐槽)

    function Animal(){ //定义父类 this.leibie="动物"; } Animal.prototype.test1=[1,2]; function Cat(n ...

  8. Sql Server 表创建以及Ef浅谈

    1.在数据库中新建两张测试表 创建用户表 use eftest go if exists(select * from sysobjects where name='UserInfo') drop ta ...

  9. Redis链表相关操作命令

    lists链表类型lists类型就是一个双向链表,通过push,pop操作.从链表的头部或者尾部添加删除元素,这样list即可以作为栈也可以作为队列 lpush key value 在链表key的头部 ...

  10. 去掉word冗余格式 java正则表达式

    word转换html时,会留下很多格式,有些格式并不是我们所需要的,然而这些格式比真正的文章内容还要多,严重影响页面的加载速度,因此就需要找个一个好的解决方案把这些多余的格式个去掉.网上有很多去除wo ...