关于javascript中call(),apply(),bind()的介绍,初步

首先,你需要知道,这三个方法的作用是一样的,那就是改变this的指向

其次,对于call和apply方法,要知道,这两个方法并非是继承而来的方法

先来看看三者是如何使用的,最后在进行总结:

1.call的用法  函数名.call(指定的this指向,参数)

(注:参数必须一一列举出来,一一列举(num1,num2,num3,...)后面进行例子展示,先记住这个就好)

请先思考下边这个例子然后再看结果:

第一个 使用call方法实例:

(1),没用使用call方法之前:

 var obj = {
           name:"小李",
           objage:19,
           myfun:function(){
               console.log(this.name)
           }
       }
       function test(name,age){
            //该测试是在非严格模式下进行的
            console.log("修改前this的指向为=> " );
            console.log(this)
       }
       test();//在非严格模式下默认绑定为window对象,

在浏览器控制台的结果如下:

(2).使用后:((this.对象的参数可以不传),原因是对象的this已经知道,那么它的属性当然也就知道啦)

var obj = {
           name:"小李",
           objage:19,
           myfun:function(){
               console.log(this.name)
           }
       }    
  
       function test(name,age){
            console.log(this.name + " " + this.objage);

            console.log("修改后this的指向为=> " );

            console.log(this)
       }

       test.call(obj,obj.name,obj.objage)

在浏览器控制台的结果如下:

 

 第二个关于call方法的传参介绍,即为什么要一一列举出来

话不多说,上例子:

(1)不一一列举出来:

var obj = {
           name:"小李",
           objage:19,
           myfun:function(){
               console.log(this.name)
           }
        } 
        function test(age1,age2){
        console.log(age1);
           console.log(age2);//undefined
            console.log(age1 +""+ age2);//19,20undefined
            console.log("修改后this的指向为=> " );
            console.log(this)
        }
        let array = [19,20];
        test.call(obj,[19,20]);

 

(2)一一列举出来:

var obj = {
           name:"小李",
           objage:19,
           myfun:function(){
               console.log(this.name)
           }
        } 
        function test(age1,age2){
        console.log(age1);//19
           console.log(age2);//20
            console.log(age1 +""+ age2);//1920
            console.log("修改后this的指向为=> " );
            console.log(this)
        }
        test.call(obj,19,20);

 

2.apply的用法  函数名.apply(指定的this指向,参数)

注:此处的参数为参数数组,(可以是Array的实例,也可以是arguments对象)

(1)没有使用apply方法的话与未使用call方法的结果一样,在这里就不在做重复解释

(2).使用apply方法

(1)传参为一一列举传入:

var obj = {
           name:"小李",
           objage:19,
           myfun:function(){
               console.log(this.name)
           }
        } 
        function test(age1,age2){
        console.log(age1);
           console.log(age2);
            console.log(age1 +""+ age2);
            console.log("修改后this的指向为=> " );
            console.log(this)
        }
        test.apply(obj,19,20);

结果如下:(报错了)

(2)以数组形式传递:

var obj = {
           name:"小李",
           objage:19,
           myfun:function(){
               console.log(this.name)
           }
        } 
        function test(age1,age2){
        console.log(age1);
           console.log(age2);
            console.log(age1 +""+ age2);
            console.log("修改后this的指向为=> " );
            console.log(this)
        }
        test.apply(obj,[19,20]);

结果如下:

总结:先对这两个方法进行总结,

首先 : 这两个方法没有什么很大的不同,不同点就在于他们的传参方式是不一样的。如果不给函数传递参数的情况下,使用哪个方法都无所谓。 

其次:可以用他们来扩充函数赖以生存的作用域,也就是改变了函数的执行环境。

3.bind的用法  

这个方法会创建一个函数的实例,其this值会被绑定到传给bind()函数的值。

猜你喜欢

转载自blog.csdn.net/L_Z_jay/article/details/109142450