zoukankan      html  css  js  c++  java
  • js笔记三:function类型

      每个函数实际上是对象。每个函数都是function类型的实例,而且都与其他引用类型一样具有属性和方法,由于函数是对象,因此函数名实际也是一个指向函数对象的指针,不会与某个函数绑定。

        由于函数名字仅仅是一个指针,因此函数名与包含对象指针没有什么不同。换句话说一个函数可能会有多个名字,

      function sum(sum1,sum2){

    return sum1 + sum2;

      }

      alert(sum(10,10))   //20

      var anothersum = sum;

      alert(anothersum(10,20))    ///30;

      sum = null;

      alert(anothersum(10,20))    ///30;

      1、函数没有重载

         如果声明两个同名的函数,而结果则是后面的函数覆盖了前面的函数。

      2、函数声明与函数表达式

         解析器在向执行环境中加载数据时,为函数声明和函数表达式并不一样,解析器会率先读取函数声明,并使其在执行任何代码之前调用,至于函数表达式,则必须等到解析器执行到它所在的代码行时,才会真正的被解析执行

          alert(sum(10,10));

          function sum(num1,num2){

            return num1 + num2;

          }

          以上代码完全可以正常运行,因为在代码开始执行之前,解析器就已经读取函数声明并将其添加到执行环境中了。

         

          alert(sum(10,10));

          var sum = function(num1,num2){

                return num1 + num2;

          }

          以上代码会在运行期间产生错误,因为在执行到函数所在语句之前,变量sum是不会保存有对函数的引用

       

       3、函数内部属性

            在函数内部有两个特殊对象:arguments和this  arguments他是一个类数组对象,包含着传入函数的所有参数,

            另一个this,this引用的是函数据以执行操作的对象,或者说this是函数在执行时所处的作用域(当在网页的全局调用函数时,this对象引用的就是window)

        window.color = 'red';

        var o = {color = 'blue'};

        function saycolor(){

          alert(this.colot);

        }

        saycolor(); //red

        o.saycolor = saycolor;

        o.saycolor();   //blue

        以上这个函数saycolor()是在全局作用域中定义的,它引用了this对象,由于在调用之前this的值并不确定,因此this可能会在代码执行过程引用不同的对象,当在全局作用域中调用saycolor()时,this引用的是全局对象window换句话说,对this.color求值会转换成window.color求值,于是结果就成了red,而当把这个函数赋值给对象o并调用了

    o.saycolor()时,this引用的就是对象o,因此this.color求值会转换成o.color求值,结果就成了blue

        注意函数的名字仅仅是一个包含指针的变量而已,因此即使在不同的环境中执行,全局的saycolor()与    o.saycolor()指向的仍然是同一个函数

         4、函数属性和方法

        每个函数都有两个属性:length和prototype

       

        其中length属性表示函数希望接受的命名参数的个数。如:

        function sayName(name){

          alert(name);

        }

        alert(sayName.length)   //1

       

        每个函数都包含两个非继承而来的方法:apply()和call(),这两个方法的用途都是在特殊的作用域中调用函数,实际上等于设置函数体内的this对象的值。

        apply()方法接受两个参数:一个是在其中运行函数的作用域,另一个参数数组,其中第二个参数可以是Array的实例,也可以是arguments对象

       

        function sum(num1,num2){

           return num1 + num2;

        }

        function callSum1(num1,num2){

           return sum.apply(this,arguments);

        }

       

        function callSum2(num1,num2){

           return sum.apply(this,[num1,num2]);

        }

         

        alert(callSum1(10,10)); //20;

        alert(callSum2(10,10)); //20;

        在这个例子中,callSum1()在执行sum()函数时传入了this作为作用域(因为是在全局作用域中调用的,所以传入的就是window对象)和argments对象.而callSum2同样也调用了sum()函数,但它传入的则是this和一个参数数组,这两个函数都会正常执行并返回正确的结果

        call()方法和apply()方法的作用完全相同,区别仅在于接受的参数方式不同,传递给函数的参数必须逐个列举来.

        function sum(num1,num2){

           return num1 + num2;

        }

        function callSum1(num1,num2){

           return sum.call(this,num1,num2);

        }

        apply()和call()真正的用武之地,他们真正强大的地方就是能够扩充函数赖以运行的作用域.

        window.color = 'red';

        var o = {color : 'blue'};

        function saycolor(){

            alert(this.color);

        }

        saycolor(); //red;

        saycolor.call(this);    //red

        saycolor.call(window);  //red

        saycolor.call(o);   //blue  当运行这句话的时候,函数的执行环境就不一样了,因为此时的函数体内this对象以及指向了o

  • 相关阅读:
    第三篇、image 设置圆角的几种方式
    第二篇、为UITableViewCell 高度自适应加速 缓存cell的高度
    第一篇、Swift_搭建UITabBarController + 4UINavigationController主框架
    Quartz2D 编程指南(三)渐变、透明层 、数据管理
    Quartz2D 编程指南(二)变换、图案、阴影
    Quartz2D 编程指南(一)概览、图形上下文、路径、颜色与颜色空间
    iOS基于MVC的项目重构总结
    iOS开发路线简述
    iOS JavaScriptCore与H5交互时出现异常提示
    iOS开发小技巧
  • 原文地址:https://www.cnblogs.com/toxiaonan/p/2432546.html
Copyright © 2011-2022 走看看