关于函数 call() bind() apply()

写过一点关于call函数的认识,但隔了一段时间后感觉不是很详尽,再重新研究一下


call apply bind

  1. 注意,箭头函数的this指向是固定的,始终指向函数定义时的对象,而不是使用时的对象
    无法使用这三个函数来为其指定this的指向
  let a = {x:3};
  let func = ()=>{
    console.log(this); 
    //箭头函数没有自己的this,它的this是该函数外层代码块的this
    // 在此处是window对象
  }
  func(); //=> window

  //call()
  func.call(a); // =>window
  //apply
  func.apply(a); // => window
  // bind()
  let func2 = func.bind(a);
  console.log(func2);// => ()=>{console.log(this);}
  func2(); // window

  1. function.call(thisArg,arg1,arg2, ...)
    每个函数都有自己的this指向,使用call方法可以为我们调用的函数指定其this指向
  function con(x){
    console.log(this.a);
  }
  con(1);  //  => undefined
  
  //使用call函数为其指出this指向
  con.call({a:2},1); // => 2
  • 当处于非严格模式时,指定的thisArg为 null undefined时,this会自动指向
    全局对象(浏览器为window,node为global)
  function con(){
    console.log(this); // => Window对象
    return 1;
  }
  let a = con.call(null); 
  console.log(a); // 1
  • 我们可以使用call方法来实现继承
    在JAVA中,我们给出一个Product类,声明类Food继承该Product类
class Product{
  protected String name;
  protected String price;
  public Product(String name,String price){
    this.name = name;
    this.price = price;
  }
}
class Food extends Product{
  private String kind;
  public Food(String name,String price,String kind){
    super(name,price);
    this.kind = kind;
  }
}
Food apple = new Food("apple","15","friut");

在js中,我们可以借助call这样来写

  function Product(name,price){
    this.name = name;
    this.price = price;
  }
  function Food(name,price,kind){
    Product.call(this,name,price);
    this.kind = kind;
  }
  let apple = new Food('apple','15','friut');
  console.log(apple); // => Food{name:'apple',price:'15',kind:'friut'};

对比上面的写法,我们在js中使用了call来调用函数Product,类似与在java中使用super()
函数来调用父类的构造方法

  • call的一个比较常见的用法是在处理类数组对象时,我们可以通过call函数,让其调用
    数组的方法,完成我们需要的操作详细讲解
    例如将类数组对象arguments转化为数组:
  let argsArr = Array.prototype.slice.call(arguments);

使用forEach方法来遍历HTMl collection

  [].forEach.call(htmlCol,(val,index,arra=>{
    console.log(val);
  }))
  1. function.apply(thisArg,[args])
    apply的用法和call差不多,区别在与apply所调用函数的参数是以数组或者类数组方式提供的
    也就是说,call中能使用的地方,都可以使用apply来替代,有时apply写的还更简单
  • 上面的继承使用apply改写
  function Product(name,price){
    this.name = name;
    this.price = price;
  }
  function Food(name,price,kind){
    Product.apply(this,arguments); 
    //这里直接将Food函数的arguments对象传过去,虽然多传了一个参数kind,但在写法上更简单
    this.kind = kind;
  }
  let apple = new Food('apple','15','friut');
  console.log(apple); // => Food{name:'apple',price:'15',kind:'friut'};
  • 将一个数组push到另一个数组中去(使用concat会创建新数组,push不会)
  let a = [1,2,3];
  let b = [4,5,6];
  [].push.apply(a,b);
  console.log(a); // => [1,2,3,4,5,6]
  • 使用max函数找出一个数组中的最大值
  let a = [1,2,3,45,6,7];

  let res = Math.max.apply(null,a);
  console.log(res); // => 45

  //另一种简化写法 : es6
  Math.max(...a); // => 45
  1. function.bind(thisArg,arg1,arg2 ...)
    bind函数不是一次原函数的调用,它会返回一个新的函数,具有指定的this指向,并且在
    调用新函数时,在bind时指定的参数会作为新函数的前几项参数值
  let a = {x:3};
  function func(){
    console.log(this.x);
  }
  func(); //=> undefined

  let func2 = func.bind(a);
  console.log(func2);// => ()=>{console.log(this.x);}
  func2();  // =>3
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容