JS基础函数的调用 -- call,apply,bind方法及其应用

call()和apply()都是函数对象的方法需要通过函数对象来调用
在调用call和apply时可以将对象指定为一个参数,此时这个对象将会成为函数执行的this。

call()

  • call方法可以将实参在对象之后一次传递
  • call可以改变这个函数的this指向,可用于实现继承
function Father(userName){
     
	this.username = userName;
}

function Child(userName){
     
	// call可以改变this的指向,使Father的this变为child的this指向,则在调用时,
	// father函数内部的this就指向了child,就可以借用父类的属性。
	Father.call(this, userName)
}

  • 参数(obj,实参1,实参2…)

apply()

  • apply方法要讲参数封装到数组中再传递
  • apply也可以改变函数内部的this指向
  • 参数(obj,[参数1,参数2…])
// 求数组的最大值或者最小值
arr = [1,4,3,6,2];
// 调用apply,在指向Math,调用max方法,求最大值
Math.max.apply(Math,arr);

bind()

  • 不会调用函数
  • 会改变函数的this指向
  • bind方法在实际开发中的应用使最多的:不需要立即执行这个函数,但是需要改变这个函数的this指向。例如,一个时间需要冷却时间,点击按钮一分钟后重新发送短信。
// bind的实现
function Father(){
     };
function fun(){
     
};
// 返回的使原函数改变this指向的新函数,因此可以重新自己调用
var f = fn.bind(Father)
f();

例子

// 实现点击按钮三秒后才允许重新点击
// 定时器里面的this指向的使window
btn.onclick = function(){
     
	this.disabled = true;
	setTimeout(function(){
      
		// 此时this指向的使btn
		this.disabled = false;
	}.bind(this),3000);\
}
call、apply、bind总结

相同点:都可以改变函数内部的this指向
不同点:

  1. call和apply可以调用函数,bind不行
  2. call和apply传递参数不一样

主要应用:
1. call经常以用于继承
2. apply经常跟数组有关,比如上诉的求最大最小值
3. bind不调用函数,可以用在定时器改变this指向

arguments

函数在调用时,浏览器每次斗湖传递两个隐含的参数:一个this,一个arguments

  1. 函数的上下文对象this
  2. 封装实参的对象arguments
    argument是一个类数组对象
    我们即使不定义形参,也可以通过arguments来使用实参:arguments[0]…

你可能感兴趣的:(javascript)