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

  • 相关阅读:
    【读书笔记】【深入理解ES6】#13-用模块封装代码
    【读书笔记】【深入理解ES6】#12-代理(Proxy)和反射(Reflection)API
    【读书笔记】【深入理解ES6】#11-Promise与异步编程
    【读书笔记】【深入理解ES6】#10-改进的数组功能
    【读书笔记】【深入理解ES6】#9-JavaScript中的类
    【读书笔记】【深入理解ES6】#7-Set集合和Map集合
    【读书笔记】【深入理解ES6】#6-Symbol和Symbol属性
    关于maven打包文件不全的处理方式
    关于Dubbo的常用模型
    Dubbo源码本地运行demo遇到的问题
  • 原文地址:https://www.cnblogs.com/toxiaonan/p/2432546.html
Copyright © 2011-2022 走看看