首页 > 代码库 > 8月3号=》331页-340页

8月3号=》331页-340页

13.8.5  函数的实例属性和类属性

    JavaScirp函数不仅仅是一个函数,而且是一个雷。根据函数中声明变量的方式,函数中的变量有3中。

      局部变量:在函数中以普通方式声明的变量。

      实例属性:在函数中以this前缀修饰的变量。

      类属性:在函数中以函数名前缀修饰的变量。

 

13.8.6  调用函数的3中方式

    定义一个函数之后,JavaScript提供了3中调用函数的方式。

    直接调用函数

      //调用window对象的alert方法

      window.alert("测试代码");

    以call()方法调用函数

      直接调用函数的方式简单、易用,但这种调用方式不够灵活。有些时候调用函数时需要动态的传入一个函数引用,

      此时为了动态地调用函数,就需要使用call方法来调用函数了。

      代码示范:

        var each = function(array,fn)

        {

          for(var index in array)

          {

            //以window为调用者来调用fn函数

            //index、array[index]是传给fn函数的参数

            fn.call(null,index,array[index]);

          }

        }

        //调用each函数,第一个参数是数组,第二个参数是函数

        each([4,20,3],function(index),ele)

        {

          document.writeln("第"+index+"个元素是:"+ele);

        }

    以apply()方法调用函数

    apply()方法与call()方法的功能基本相似,他们都可以动态地调用函数。

    apply()与call()的区别如下:

      通过call()调用函数时,必须在括号中详细地列出每个参数。

      通过apply()动态地调用函数时,可以在括号中以arguments来代表所有参数。

    代码示范:

      var myfun = function(a,b)

      {

        alert("a的值是:"+a+"/nb的值是:"+b);

      }

      var example = function(num1,num2)

      {

        //直接用arguments代表调用example函数时传入的所有参数

        myfun.apply(this.arguments);

      }

      //为apply()动态调用传入数组

      myfun.apply(window,[12,23]);

      example(20,40);

 

13.8.7  函数的独立性

    虽然定义函数时可以将函数定义成某个类的方法,或定义成某个对象的方法。但JavaScript的函数时"一等共鸣",它永远是独立的,

    函数永远不会从属于其他类、对象。

    代码示范:

      function Dog(name,age,bark)

      {

        this.name = name;

        this.age = age;

        this.bark = bark;

        this.info = function()

        {

          return this.name+"的年龄为:"+this.age+",它的叫声是:"+this.bark;

        }

      }

       //创建Dog的实例

      var dog = new Dog("旺财",3,"汪汪");

      //创建Cat函数,对应Cat类

      function Cat(name,age)

      {

        this.name = name;

        this.age = age;

      }

      //创建Cat实例

      var cat = new Cat("kitty",2);

      //将dog实例的info方法分离出来,在通过call方法来调用info方法。

      //此时以cat为调用者

      alert(dog.info.call(cat));

    输出结果为:kitty的年纪为:2,它的叫声:undefined。

    上面程序函数Dog定义了名为info()的实例方法,但这个info()方法并不完全属于Dog实例,它依然是一个独立函数,所有程序在最后一行代码

    处将该函数分离出来,并让Cat实例来调用这个info()方法。

 

13.9  函数的参数处理

    大部分时候,函数都需要接受参数传递。JavaSript的参数全部是采用值传递方式。

13.9.1  基本类型和复合类型的参数传递

    对于基本类型参数,JavaScript采用值传递方式,因此在函数中修改参数值并不会对实参有任何影响。

    基本类型参数代码示范:

      function change(num)

      {

        num=5;

        document.write("函数里的num="+num);

      }

      var num = 1;

      change(num);

      document.write("传入函数的num为"+num);

    复合类型参数代码示范:

      function change(person)

      {

        person.age = 10;

        document.writeln("函数执行中person的age值为:"+person.age);

      }

      //使用json语法定义person对象

      var person = {age:5};

      document.writeln("函数调用前的person的age的值为:"+person.age);

      change(person);

      document.writeln("函数调用后的person的age的值为:"+person.age);

    结果为:函数调用前的person的age的值为:5

        函数执行值的person的age值为:10

        函数调用后的person的age的值为:10

 

13.9.2  空参数

    在JavaScript的函数中会将没有传入实参的参数值自动设置为undefined值。

    代码示范:

      function changeAge(person)

      {

        if(typeof person ==‘object‘)

        {

          document.write(person.age);

        }

        else

        {

          alert("参数类型不符合:"+typeof person);

        }

      }

    输出结果为:参数类型不符合:undefined。

    由于JavaScript调用函数时对传入的实参并没有要求,因此JavaScript没有所谓的函数“重载”,如果先后定义两个同名的函数,

    它们的形参列表并不相同,这也不是函数重载,这种方式会导致后面定义的函数覆盖前面定义的函数。

    代码示范:

      function test()

      {

        alert("第一个无惨的test函数");

      }

      function test(name)

      {

        alert("第二个有参的函数");

      }

      test();

    输出结果始终未第二个test函数。

    

13.9.3  参数类型

    JavaScript函数声明的参数列表无须类型声明,这是它作为一个弱类型语言的特征。

    代码示范:

      //name可以为任意类型 但在函数里面是不需要声明传入的name是什么类型。

      function test(name)

      {

      }