zoukankan      html  css  js  c++  java
  • JS函数与call()apply()详解

    JavaScript中的每个函数都是一个对象

      因为函数都是对象,它们有自己的属性和方法。我们可以把它们看作数据(data)。

    函数和方法的区别?
      函数立足于它们自己(例如:alert()),
      而方法是函数内部一个对象的属性(dictionary),我们通过对象来调用方法。
      每个JavaScript函数都会有很多附属的(attached)方法,包括toString()、call()以及apply()。


    定义了一个全局函数f()。f()通过this关键字访问变量x,

    var x = 10;
    function f(){
     alert(this.x);
    }
    f();
    function p(){
    var x=100;
    alert(x);
    }
    p();

    注意:我们不能通过一个对象的实例来调用这个函数。

      this指向的是什么对象呢?this会指向这个全局对象。我们的变量x就是在这个全局对象中定义的。

      上面的代码能够正常运行,运行结果会显示一个对话框,对话框中显示10。 第二个函数 输出100,函数内部属性

    js里call函数改变对象指针,指向另一个对象调用

    var x = 10;
    var o = { x : 15};
    function f(){
     alert(this.x);
    }
    f();
    f.call(o);

      首先调用f()将会显示10的对话框,因为this这个时候指向的是全局对象。

      然后我们调用f函数的call()方法,传入的参数是o,运行结果显示的是o中x属性的值15。

      call()方法会用它的第一个参数作为f函数的this指针。也就是说,我们会告诉运行时,f函数中的this指向的是哪个对象。

    call传入参数

    <script type="text/javascript">
        var x = 10;
    var o = { x : 15};
    function f(y){
     alert(this.x); this指O对象
     alert(y);
    }
    
    f.call(o,this.x); this指全局对象属性10
        </script>
    <script language="javascript"><!--
       
        /**定义一个animal类*/  
        function Animal(){   
            this.name = "Animal";   
            this.showName = function(){   
                alert(this.name);   
            }   
        }   
        /**定义一个Cat类*/  
        function Cat(){   
            this.name = "Cat";   
        }   
          
        /**创建两个类对象*/  
        var animal = new Animal();   
        var cat = new Cat();   
              
        animal.showName.call(cat,",");
    //通过call或apply方法,将原本属于Animal对象的showName()方法交给当前对象cat来使用了。   
        //输入结果为"Cat"   
    </script>

    call函数实现对象继承

    <script language="javascript"><!--
      function Class1() 
    { 
        this.showTxt = function(txt) 
        { 
            alert(txt); 
        } 
    } 
    
    function Class2() 
    { 
        
        Class1.call(this); 
    } 
    
    var c2 = new Class2(); 
    
    c2.showTxt("cc"); 
    </script> 

    c2对象可以具有了 Class对象的所有方法

    apply()函数

      对于apply和call两者在作用上是相同的,但两者在参数上有区别的。 

      对于第一个参数意义都一样,但对第二个参数: 
    apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。 
      如 func.call(func1,var1,var2,var3)

      对应的apply写法为:func.apply(func1,[var1,var2,var3]) 

  • 相关阅读:
    linux socket c : send data when socket close—SIGPIPE, Broken pipe
    (OK) server-client-pthread-c language
    (OK) Linux epoll模型—socket epoll server client chat—pthread
    (OK) pthread—epoll-loops-on-disconnection-of-a-client—server
    (OK) Linux epoll模型—socket epoll server client chat
    (OK) 刘姐实验中的大数据分析—awk—paste—system
    (OK) cBPM-CentOS—wrapped by fastcgi—files—executing commands
    (Not OK) 在CentOS7—编译nginx—for—Android—Makefile
    (Not OK) 在CentOS7—编译nginx—for—Android
    (OK) 在CentOS7—编译OpenSSL 静态库—for—Android
  • 原文地址:https://www.cnblogs.com/jiechn/p/4075872.html
Copyright © 2011-2022 走看看