js基础_46、函数的方法call和apply

—-这两个方法都是函数对象的方法,需要通过函数对象来调用
—-当对函数调用call()和apply()都会调用函数执行。
比如:

fun.call();
fun.apply();
fun();

以上三种效果一致。
—-在调用call()和apply()可以将一个对象指定为第一个参数,此时这个对象将会成为函数执行时的this。

   var obj={name:'obj'};
            var obj2={name:'obj2'};
            function fun(){
                alert(this);
            }
            //fun();
            //fun.call(obj2);
            fun.call(obj2.name);

以函数形式调用时:this为window,如图:
image

以call方法调用时,this为传递的实参,如图:
image

在对象里定义一个方法,使用call方法调用和函数调用:

     var obj={
                name:'obj',
                sayname:function(name){
                    alert(this.name);
                }
            };
            var obj2={name:'obj2'};
            function fun(){
                alert(this);
            }
            obj.sayname(obj2);//obj.sayname();不用传也一样

使用函数调用this始终为自己,输出结果如图:
image

函数调用:

       var obj={
                name:'obj',
                sayname:function(name){
                    alert(this.name);
                }
            };
            var obj2={name:'obj2'};
            function fun(){
                alert(this);
            }
            obj.sayname.call(obj2);

方法指定了对象,所以对象为obj2,结果如图:
image

call()和apply()的区别:

—-call()方法可以将实参在对象之后依次传递,

比如:


            function fun(a,b){
                console.log('a='+a);
                console.log('b='+b);
            }
            var obj={
                name:'obj',
                sayname:function(name){
                    alert(this.name);
                }
            };
            var obj2={name:'obj2'};
            fun.call(obj,2,3);

输出如图:
image

—-apply()方法需要将实参封装到一个数组中统一传递
    function fun(a,b){
                 console.log('a='+a);
                console.log('b='+b);
            }
            var obj={
                name:'obj',
                sayname:function(name){
                    alert(this.name);
                }
            };
            var obj2={name:'obj2'};
            fun.apply(obj,[2,3]);

总结,这两个方法可以改变this的指向,一个直接传参,一个封装在数组中传参。总结,这两个方法是改变this的指向,一个直接传参,一个封装在数组中传参。

this的情况:

1、以函数的形式调用时,this永远都是window
2、以方法的形式调用时,this是调用此方法的那个对象
3、以构造函数的形式调用时,this是构造函数的创建的那个新对象(实例)。
4、使用call()和apply()形式调用时,this是指定的那个对象。

posted @ 2022-03-12 10:14  青仙  阅读(110)  评论(0编辑  收藏  举报