zoukankan      html  css  js  c++  java
  • call和apply的作用和区别

    call和apply用来调用函数,并用指定对象(第一个参数)替换函数的 this 值,同时用指定数组替换函数的参数。注:也可以不指定参数,此时只是单纯的调用函数,如:fun.call()

    语法:

      fun.call(thisobj,arg1,arg2) ;当后面参数个数确定时用call,参数之间用逗号连接

      fun.apply(thisobj,[arg1,arg2]);当后面参数个数不确定时用apply,参数通过数组形式输入

    call和apply的作用:

      改变this的指向,第一个参数为你要传入的对象,传入后函数的this就指向了这个对象,后面的参数为你为函数传递的参数值

    简单案例:

    var str='js';
    function fo(){
      var str='jq';
      console.log(this.str);//此时this指向window
      console.log(this===window);
      console.log(this===obj);
      //输出js,true,false
    }
    fo();
    var obj={
      str:'html'
    };
    fo.call(obj)//输出html,false,true,这就证明了call将fo的this指向改为了obj;
    var ob={
      str:'css',
    }
    var get=function(){
      console.log(str);//js 此时读取的是全局变量的值
      console.log(this.str);//css 此时this指向了ob,返回的就是ob.str
    }
    get.call(ob)

    复杂案例:

    function log(){
      var args=Array.prototype.slice.call(arguments);//将参数转为数组

      //slice(start,end(非必须) )方法可从已有的数组中返回选定的元素。

      //Javascript函数中的参数对象arguments是个对象,而不是数组。但它可以类似数组那样通过数字下表访问其中的元素,而且它也有length属性标识它的元素的个数。通常我们把它转换成数组用Array的slice函数,示例代码如下:function fn() { var arr = Array.prototype.slice.call(arguments,0);}

      //所以Array.prototype.slice.call(arguments)就是将参数转为数组然后返回数组

      console.log(args);//Array [ "hello", "world" ]
      args.unshift('(gykj)');//unshift(a,b,c)向数组的开头添加至少一个元素
      console.log(args);//Array [ "(gykj)", "hello", "world" ]
      console.log.apply(console,args);//(gykj) hello world 这里的apply可以将数组元素作为字符参数输出

      //由于参数个数不确定这里只能使用apply
    }
    log('hello','world')

  • 相关阅读:
    PS_0005:画带颜色在线条框 按住Alt键复制
    零钱兑换(动态规划)
    倒排索引原理和实现
    集群搭建
    java内部类
    nohup &后台运行脚本
    scala构造函数
    spark数据源读取及读数据原理
    安装redis解决公司linux环境的坑
    61、对于employees表中,给出奇数行的first_name
  • 原文地址:https://www.cnblogs.com/webwangjie/p/7062067.html
Copyright © 2011-2022 走看看