call、apply、bind的用法

1、Funciton.prototype.call()

call()方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。语法如下:

function.call(x [,arguments…) )

call()方法的第一个参数传入重新指定的this对象,若function需要传入参数,则用逗号隔开

举例说明:

    var name='apple',price=5;
    var fruit = {
        name:'pear',
        price:4,
        log:function(){console.log('furit:'+this.name+'|price:'+this.price); }
        log2:function(a,b){console.log('furit:'+this.name+'|price:'+this.price+a+b); }
    }
    
    furit.log();            	   //furit:pear|price:4
    furit.log.call(window)         //furit:apple|price:5
    
	furit.log2(3,2)          	   //furit:pear|price:432
	furit.log2.call(window,3,2)    //furit:apple|price:532

上面例子可以看出,当直接执行函数 furit.log() 时,this指向的并非window对象,而是指向fruit对象。
若用call方法,则可将函数内的this从furit指向window。
若需要传入参数,如 furit.log2() 所示,可在指定this对象增加传入参数,用,隔开。

参考:
Funciton.prototype.call()—MDN

2、Funciton.prototype.apply()

apply() 方法,语法如下:

function.apply(x ,[arg1,arg2…] )

举例说明:

var numbers = [5, 6, 2, 3, 7];

var max = Math.max.apply(window, numbers);

console.log(max);  // 7

var min = Math.min.apply(window, numbers);

console.log(min);  // 2

同call()方法,第一个参数传入this指向对象,但与call()方法不同的是,apply()方法使用数组传入参数。

参考:
Funciton.prototype.apply()—MDN


3、Funciton.prototype.bind()

bind()方法不同于以上两种方法,该方法将创建一个新的函数,在被调用时,函数的this被bind()的第一个参数指定,其余的参数将作为新函数的参数供调用时使用。

语法如下:

function.bind(x(, arg1, …))

举例说明

var x = 9; 
var module = {
  x: 81,
  getX: function() { return this.x; }
};
module.getX();          // 81

var retrieveX = module.getX;
retrieveX();            // 9

var boundGetX = retrieveX.bind(module);
typeof(boundGetX)       //'function'
boundGetX();            // 81
boundGetX.call(window)  //81

由以上例子,可以看出bind()方法的特点:

  1. bind()方法的返回值是一个函数,需要再次调用
  2. bind()方法新创建的函数,会直接更换this对象,且不可被call()重新指定

参考:
Funciton.prototype.bind()—MDN

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值