您的当前位置:首页正文

apply,call和bind的使用及区别

2023-11-03 来源:钮旅网
apply,call和bind的使⽤及区别

1  1)apply,call和bind都是 ⽤来改变this的指向

  2)apply和call会让当前函数⽴即执⾏,⽽bind会返回⼀个函数,后续需要的时候再调⽤执⾏

2this的指向有以下四种情况:

  1)如果函数中的this没有调⽤对象,则this指向window(严格模式下,this为undefined)  2)如果函数中this被不包含⼦对象的对象调⽤,则this指向调⽤它的对象  3)如果函数中this被包含多级对象的对象调⽤,则this指向调⽤它的上⼀级对象

  4)如果我们调⽤了对象,并将其赋值给某个变量,然后在需要的时候再去调⽤执⾏它,则此时this也是指向的window对象,如:    var a = obj.myFunc;    a();

var name=\"zhang\";var age=18;var obj={

name:\"liu\

myAge:this.age, myFun:function(){

console.log(this);  // this指向obj console.log(this.name+\";\"+this.age) }}

obj.myAge  // 18obj.myFun()

上图是我们很常⽤的⼀个对象属性的获取和⽅法的调⽤,在我们获取obj.myAge属性时,这⾥的this实际是window对象,所以我们去找window.age,找到的是全局参数age=18

在调⽤myFun()⽅法时,本着谁调⽤this就指向谁的基本原则,此时this指向的是obj对象,所以我们输出的this.name为liu,this.age为undefined上⾯的例⼦如果不太好理解的话,我们看下⾯这个更直观的例⼦:var name=\"zhangsan\";function showName(){ console.log(this);

console.log(this.name);}

showName();

我们在这⾥直接定义了⼀个⽅法,并且调⽤了它,上⾯说了,谁调⽤函数,函数⾥⾯的this就指向谁,但是我们这⾥直接调⽤了showName(),并没有明确说明是谁调⽤了它啊,其实这⾥我们可以理解为window.showName(),即this实际上是指向的window。

3  1)先来看看call是如何实现的:

Function.prototype.call=function(context){ // 这⾥的this指向demo函数 console.log(this);

context=context?Object(context):window; context.fn=this; var args=[];

// 参数从1开始循环因为第⼀个参数是context for(var i=1;i// 这⾥执⾏context.fn() 即上⾯的demo(),所以this指向了context,但是因为我们没有传递context,所以this指向了window var r = eval(\"context.fn(\"+args+\")\") delete context.fn; return r;}

var name=\"test\"function demo(){ console.log(this)

console.lot(this.name)

}

demo.call();

  1) 当我们传递了context时,context为我们传递的对象;否则为window对象。

  2) 谁调⽤,this指向谁,我们通过demo.call 调⽤了call⽅法,所以这⾥的this指向的时demo函数  3)将传递的参数放进args中

  4)通过eval函数执⾏我们的context.fn,即上⾯的demo函数

  5)demo函数中,this指向的时call⽅法中的context,这⾥时window对象  6)this.name即window.name

2)call其实是apply的⼀个语法糖,他们的作⽤都是⽤于改变上下⽂的指向,区别在于,call接受多个参数,⽽apply接受的是⼀个数组var db={

  name:\"dema\"}

var obj={

name:\"obj\

myFunc:function(from,to){ console.log(this);

console.log(this.name+\"来⾃:\"+from,+\"去往:\"+to); }}

obj.myFunc.call(null,'北京','上海')  // this 指向window,this.name=undefined,from=北京,to=上海obj.myFunc.call(db,'北京','上海');  // this指向db,this.name='dema',from=北京,to=上海obj.myFunc.apply(db,['北京','上海']);  // this指向db,this.name='dema',from=北京,to=上海

上⾯例⼦中,我们分别调⽤了call和apply,并传⼊了参数null,db和地名,从上⾯的call的实现中,可以看到,我们接受的第⼀个参数是上下⽂context,⽤于改变this的指向。

所以上⾯第⼀⾏,传⼊的context为null,则this指向window,第⼆⾏和第三⾏,都传⼈了context为db,所以this此时是指向db的,即this.name=db.name4、bind

bind也是⽤于改变上下⽂的指向,它和call⼀样,接受多个参数。

bind和apply,call的区别在于,bind返回⼀个⽅法,⽤于后⾯调⽤,apply和call会直接执⾏function print(a,b,c){ console.log(a,b,c)}

var fn = print.bind(null,'D')fn('A','B','C')  // D,A,B

因篇幅问题不能全部显示,请点此查看更多更全内容