zoukankan      html  css  js  c++  java
  • js函数调用模式

    1、函数调用
       调用一个函数将暂停当前函数的执行,传递控制权和参数给新函数。除了函数声明时定义的形参,每个函数还接受两个附加的参数:this和arguments(arguments并不是一个真正的数组,它拥有length属性,但它缺少数组的所有方法)。参数this在面向对象编程中非常重要,它的值取决于调用的模式。在js中一共有四种调用模式:方法调用模式、函数调用模式、构造器调用模式和apply调用模式。这些模式在如何初始化关键参数this上存在差异。arguments的个数取决于函数定义时候形参的个数,如果调用函数时,传递的形参与函数定义的参数个数不匹配不会导致运行错误,调用时传递的参数过多,超出的参数会被忽略,如果过少,缺失的值被undefined代替。

    2、方法调用模式
     1 var myObj = {
     2            value:0,
     3            increment:function(val){
     4                 this.value += typeof val ==="number" ? val : 1;//this为myObj对象
     5            }
     6      };
     7      myObj.increment();
     8      document.write(myObj.value);//1
     9      myObj.increment(2);
    10      document.write(myObj.value);//3
       方法可以使用this去访问,所以它能从对象取值或修改该对象。this到对象的绑定发生在调用的时候。这个“超级”迟绑定使得函数可以对this高度复用。通过this可取得它们所属对象的上下文的方法称为公共方法。

    3、函数调用模式

    1 var name = "zhangsan";//aa变量加载到了window对象上
    2    function test(){
    3       function test1(){
    4          document.write(this.name);//zhangsan,this为window对象
    5       };
    6    test1();
    7 }        
    8 test(); 

          当函数以此模式调用时,this被绑定到全局对象。这是语言设计的一个错误。倘若语言设计正确,当内部函数被调用时,this应该仍然绑定到外部函数的this变量。这个设计错误的后果是方法不能利用内部函数来帮助它工作,因为内部函数的this被绑定了错误的值,所以不能共享该方法对对象的访问权。幸运的是,有一个很容易的解决方案:如果该方法定义一个变量并给它赋值为this,那么内部函数就可以通过那个变量访问到this,按照约定,我给那个变量命令为that

     1 //目的:使用add方法对数值进行相加
     2 //给myObject增加一个double方法。
     3 myObject.double = function(){
     4    var that = this;//解决方法
     5       var helper = function(){
     6           that.value = add(that.value,that.value);//add方法为两数字相加
     7       };
     8     helper();//以函数的形式调用helper
     9 };
    10 //以方法模式调用double
    11 myObject.double();
    12 document.write(myObject.getValue());//6,这样helper方法可以使用this

    4、构造器调用模式

          对象实例调用原型中的方法时,该方法可以使用this访问其构造函数内的属性或方法。

     1 //创建一个名为Quo的构造函数,它构造一个带有status属性的对象。
     2 var Quo = function (str,name){
     3    this.status = str;
     4    this.name = name;
     5 };
     6 //给Quo的所有实例提供一个名为get_status的公共方法。
     7 Quo.prototype.get_status = function(){
     8    return this.status;//this能访问到status
     9 };
    10 Object.prototype.get_name = function(){
    11    return this.name;//能访问到name
    12 };
    13 //构造一个Quo实例
    14 var myQuo = new Quo("confused","zhangsan");
    15 //confused,document.write()和document.writeln都是js向客户端写入的方法,writeln是以行方式输出的,但并不是指页面实际效果中的换行,即页面的实际效果是没有换行的。
    16 document.writeln(myQuo.get_status());
    17 document.write(myQuo.get_name());//zhangsan

    5、Apply调用模式

         apply方法让我们构建一个参数数组并用其去调用函数。它也允许我们选择this的值。
         apply方法接受两个参数,第一个是将被绑定给this的值,第二个就是一个参数数组。

    1 var myStatus = {
    2    status:'A-OK'
    3 };
    4 //myStatus并没有继承自Ouo.prototype。但我们可以在myStatus上调用get_status方法,尽管myStatus并没有一个名为get_status的方法
    5 var st = Quo.prototype.get_status.apply(myStatus);//A-OK
    6 var st1 = myQuo.get_status.apply(myStatus);//A-OK
  • 相关阅读:
    JavaScript关闭窗口的方法
    .NET 实现异步处理的集中方式
    c#调用系统资源大集合-3
    c#调用系统资源大集合-2
    android sqlite 操作使用
    android 适配的大小设置
    java.lang.IllegalStateException: Fragment already added:
    keydown 事件响应处理
    android 图表图形显示推荐 开源库
    android bitmap mutable
  • 原文地址:https://www.cnblogs.com/yuyuj/p/4525569.html
Copyright © 2011-2022 走看看