web前端javaScript笔记——(8)call()、apply()、arguments()

发布时间:2024年01月08日
<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>
       
    </title>
    <style>
    
    </style>
    <script type="text/javascript">
    /*    function fun(){
            alert("我是fun函数!");
        }
    */
        /*call()和apply()
         这两个方法都是函数对象的方法,需要通过函数对象来调用
         当会函数调用call()和apply()都会调用函数执行
         在调用call()和appply()可以将一个对象指定为第一个参数
         此时这个对象将会成为函数执行时的this
         */
  //      fun();   //弹出"我是fun函数"
  //      fun.apply();    //弹出"我是fun函数"
  //      fun.call();      //弹出"我是fun函数"
        
        //在调用call()和apply()可以将一个对象指定为第一个参数
   //     var obj={};
 //       fun.call(obj);   //弹出"我是fun函数"
        
  /*      function fun1(){
            alert(this);
        }
        //以函数形式调用this是window
        fun1();   //[object window]
        //apply() call()传递的对象是谁,this就是谁
        fun1.call(obj)   //[object Object]
        fun1.aooly(obj);   //[object Object]
    */
 /*    function fun(){
         alert(this.name);
     }
     var obj={name:"sunwukong"};
     var obj2={name:"zhubajie"};
     fun.apply(obj);  //sunwukong
     fun.call(obj);   //sunwukong
     fun.apply(obj2);  //zhubajie
     fun.call(obj2);   //zhubajie */
     
     /*fun()和call() apply()的区别
      fun() 的this只能是window
      fun.call() fun.apply()可以指定this是什么*/
     
     /*用apply()可以指定函数执行时的参数*/
  /*   var obj={
         name:"obj",   //是逗号,不是分号
         sayName:function(){
             alert(this.name);
         }
     }
     obj.sayName();  //obj
     obj.sayName.apply(obj3);
     */
     
      /*call()方法可以将实参在对象之后依次传递
       apply()方法需要将实参封装到一个数组中统一传递*/
      function fun(a,b){
          console.log("a="+a);
          console.log("b="+b);
      }
      var obj={};
      fun.call(obj);
      //a is undefined
      //b is undefined
      fun.call(obj,2,3);//a=2  b=3
      fun.apply(obj,[3,4]);  //a=3  b=4
      
     /*this的情况:
      1.以函数形式调用时,this永远是window
      2.以方法的形式调用时,this是调用方法的对象
      3.以构造函数调用时,this是新创建的那个对象
      4.使用apply()和call()调用时,this是指定的那个对象
      * */
      
     
    </script>
</head>
<body>
   
    
</body>
</html>
<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>
       
    </title>
    <style>
    
    </style>
    <script type="text/javascript">
     /*在调用函数的时候,浏览器每次都会传递进两个隐含的参数
      1.函数的上下文对象this
      2.封装参数的对象arguments
      arguments是一个类数组对象,不是数组
      它也可以通过索引来操作数组,也可以获取长度
      在调用函数时,我们所传递的参数都会在arguments中保存
      也可以通过arguments[下标]的方式读取,下标从0开始
      arguments.length可以用来获取实参的长度
      
      
      即使不定义形参,也可以通过arguments来使用实参
      只不过比较麻烦
      arguments[0]  表示第一个实参
      arguments[1]  表示第二个实参
      不管是否定义形参,实参还是会在arguments中保存
      * */
     function fun(a,b){
  //       console.log(arguments);  //[object Arguments]
  //       console.log(arguments instanceof Array);  //false
  //       console.log(Array.isArray(arguments));    //false
 //     console.log(arguments.length);                  //2
   //     console.log(arguments[0]);      //hello
    //    console.log(arguments.callee);
        /*arguments中有一个属性callee,arguments.callee
         * 它所对应一个函数对象,就是当前正在指向的函数对象*/
        /*? fun(a,b){
  //       console.log(arguments);  //[object Arguments]
  //       console.log(arguments instanceof Array);  //false
  //       consol*/
        console.log(arguments.callee==fun)    //true
     }
 //    fun();  
     fun("hello","nihao");
    </script>
</head>
<body>
   
    
</body>
</html>

文章来源:https://blog.csdn.net/JLY19970726/article/details/135465271
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。