函数:
具名函数
匿名函数
一.函数定义
(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 语句。
(4)apply/call调用:通过使用apply和call方法,可以用任何对象作为函数上下文,并将它显性的操作
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会将此代码拆分两行代码分别执行。先把变量名提升,函数的表达式仍然在原来的位置