『Javascript基础重点』7.函数进阶之call()和apply()与arguments


欢迎关注 『Javascript基础重点』 专栏,持续更新中
欢迎关注 『Javascript基础重点』 专栏,持续更新中
介绍一些Javascript的基础重点知识,包括并不限于函数作用域与提前声明和对象的构造函数等问题。

1. 函数指定对象调用之call()和apply()

省流助手:call()和apply()用于让函数调用时的this改为自定义的对象,两者自身的区别在于参数传入时一个用逗号间隔传入参数,一个用参数的数组传入。高阶用法是用对象1的方法,使用对象2的属性作为参数。

  • 细节详解
  • call()和apply()
    • 这两个方法都是函数对象的方法,需要通过函数对象来调用
    • 当对函数调用call()和apply()都会调用函数执行
    • 在调用call()和apply()可以将一个对象指定为第一个参数,此时这个对象将会成为函数执行时的this
    • call()方法可以将实参在对象之后依次传递
    • apply()方法需要将实参封装到一个数组中统一传递
    • this的情况:
  •   1.以函数形式调用时,this永远都是window
    
  •   2.以方法的形式调用时,this是调用方法的对象
    
  •   3.以构造函数的形式调用时,this是新创建的那个对象
    
  •   4.使用call和apply调用时,this是指定的那个对象
    

下面我们用随便定义的一个fun()函数和随便定义的obj对象为展开例子简易分析异同点

1. 调用无形参函数时效果相同

call()和apply()和fun()在调用无形参函数时效果差不多。

    <script type="text/javascript">
      function fun() {
        alert("11111");
      }
      fun(); //11111
      fun.call(); //11111
      fun.apply(); //11111
    </script>

2. 调用有形参函数时三者各有区别

  • 关于call()和apply()带参数调用的一个错误写法
    <script type="text/javascript">
      //如果函数有参数,那么三者就会出现不同
      function fun(message) {
        alert(message + "11111");
      }
      fun("fun+"); //fun+11111
      fun.call("call+"); //undefined11111
      fun.apply("apply+"); //undefined11111
    </script>
  • 正确写法,call 参数用逗号间隔,而apply必须把参数放入一个数组传入
 <script type="text/javascript">
      //如果函数有参数,那么三者就会出现不同
      function fun(message1, message2) {
        alert(message1 + message2 + "11111");
      }
      var obj = {}; //随便定义一个对象,call和apply需要用对象作为第一个参数
      fun("fun", "+"); //fun+11111
      fun.call(obj, "call", "+"); //call+11111
      fun.apply(obj, ["apply", "+"]); //apply+11111
    </script>

3. 高阶用法,调用对象1的方法,但是参数使用对象2的属性

虽然用的是obj对象里的sayName方法,但是得到的是obj2name

    <script type="text/javascript">
      var obj = {
        name: "obj",
        sayName: function () {
          alert(this.name);
        },
      };
      var obj2 = {
        name: "obj2",
      };
      obj.sayName.apply(obj2, ["apply", "+"]); //obj2
    </script>

2. 函数调用时传入的隐含参数 arguments

  • 在调用函数时,浏览器每次都会传递进两个隐含的参数:
  • 1.函数的上下文对象 this
  • 2.封装实参的对象 arguments
    • arguments是一个类数组对象,它也可以通过索引来操作数据,也可以获取长度
    • 在调用函数时,我们所传递的实参都会在arguments中保存
    • arguments.length可以用来获取实参的长度
    • 我们即使不定义形参,也可以通过arguments来使用实参,只不过比较麻烦,
  •    arguments[0] 表示第一个实参
    
  •    arguments[1] 表示第二个实参 。。。
    
    • 它里边有一个属性叫做callee,这个属性对应一个函数对象,就是当前正在指向的函数的对象
    <script type="text/javascript">
      /*
       * 在调用函数时,浏览器每次都会传递进两个隐含的参数:
       * 	1.函数的上下文对象 this
       * 	2.封装实参的对象 arguments
       * 		- arguments是一个类数组对象,它也可以通过索引来操作数据,也可以获取长度
       * 		- 在调用函数时,我们所传递的实参都会在arguments中保存
       * 		- arguments.length可以用来获取实参的长度
       * 		- 我们即使不定义形参,也可以通过arguments来使用实参,
       * 			只不过比较麻烦
       * 			arguments[0] 表示第一个实参
       * 			arguments[1] 表示第二个实参 。。。
       *		- 它里边有一个属性叫做callee,
       * 			这个属性对应一个函数对象,就是当前正在指向的函数的对象
       *
       */

      function fun(a, b) {
        console.log(arguments instanceof Array); //false 类数组但不是数组,也可以索引操作数据
        console.log(Array.isArray(arguments)); //false  类数组但不是数组,也可以索引操作数据
        console.log(arguments[0], arguments[1]); // qwer,true  输出了2个传入的参数->"qwer", true
        console.log(arguments.length); //2 输出了传入参数的长度为2
        console.log(arguments.callee == fun); //true 输出了当前指向的对象是函数本身
      }

      fun("qwer", true);

总结

大家喜欢的话,给个👍,点个关注!给大家分享更多计算机专业学生的求学之路!

版权声明:

发现你走远了@mzh原创作品,转载必须标注原文链接

Copyright 2023 mzh

Crated:2023-3-1

欢迎关注 『Javascript基础重点』 专栏,持续更新中
欢迎关注 『Javascript基础重点』 专栏,持续更新中
『1.提前声明问题,你苦恼写了js函数代码但是不会生效的问题吗?』
『2.易错点之函数形参与函数作用域的坑』
『3.了解原型对象优雅地构造函数の“JS中的Java继承” 提高运行效率,优雅地使用对象』
『4.JS垃圾回收机制简析』
『5.以toString()为例学习JS中的java方法重写』
『6.数组的常用方法与数组遍历』
『7.函数进阶之call()和apply()与arguments』
『8.Date类与利用时间戳来测试代码的执行的性能』
『9.Math类方法』
『10.包装类』
『11.字符串的方法』
『12.正则表达式介绍 邮件正则表达式写法』
『13.dom的应用』
『未完待续』


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发现你走远了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值