函数:

   具名函数

   匿名函数

一.函数定义

   (1)函数声明

            函数声明只能出现在程序或函数体内,

          function  fun(){

               //函数体           

           }

 

(2)函数表达式

          匿名函数表达式

           var fun = function(){

                 //函数体      

          }

         具名函数表达式

           var fun = function f(){

                //函数体   

         }

          具名函数表达式的函数名只能在创建函数内部使用

(3)函数构造函数

          Var fun = new Function(),一般不建议使用

    二.函数调用方式:

   (1)作为函数被调用,是由于函数后面加上()操作符来触发的,用这种方式调用时,函数的上下文就是全局的上下文,即window对象

  (2)方法调用模式:一个函数是一个对象的属性,当这个函数被调用时候,这个函数就视为这个对象的一个方法。当这个函数作为一个对象的方法被调用的时候,这个对象就成为这个函数的上下文。

函数的上下文的产生,并不由函数的定义来决定,而是由函数的调用来决定。

 (3)构造函数调用:想让一个函数作为构造器被调用,需要new关键字,this为创建的新对象

 关于new的过程

   1)创建一个空的对象,仅包含Object的属性和方法。

   2)将prototype中的属性和方法创建一份引用,赋值给新对象

   3)将this上的属性和方法新建一份,赋值给新对象

   4)返回this对象,忽略return 语句。

 (4apply/call调用:通过使用applycall方法,可以用任何对象作为函数上下文,并将它显性的操作

Apply(),接收两个参数,第一个参数作为函数上下文的对象,第二个参数,一个参数数组

Call(),则是另一个简单的形式,第一个参数作为函数上下文的对象,第二个参数只需要传递参数列表来代替参数数组。

三.函数的属性和方法

        Function()的属性:prototype

        Function对象实例属性:

         (1)arguments:arguments对象是一种类数组对象,它包含所有传递给函数的参数,arguments对象拥有名为callee的属性,这个属性指向的是当前执行的函数,这个属性可以一直用于在函数内部获取到函数自身。arguments对象拥有length属性,它给出的是在调用时发送给函数的参数数量。这个属性已经被js1.4中废除。 

             (2)constructor

             (3)length:而这个函数实例length属性,提供的是已定义参数的数量,它可以获得函数所需要的参数总数量。
        Function对象实例方法:

             (1)apply()

             (2)call()

             (3)toString()

四.匿名函数,自调用的匿名函数表达式,自调用的匿名函数语句

五.函数可以无限地嵌套在其他函数内部

在真正定义函数语句之前,可以在执行时调用该函数语句,因为函数声明提升的作用。使用函数声明语句的话,函数名称和函数体均提前,使用函数定义表达式js会将此代码拆分两行代码分别执行。先把变量名提升,函数的表达式仍然在原来的位置