一、函数的基本概念
通过函数可以封装任意多条语句,可以再认可地方/时候调用执行。基本语法:
function functionName(arg0,arg1,…argN){
statements
}
1、返回值
ECMAScript种的函数在定义时(参数中)不必指定是否返回值。
未指定返回值的函数返回的是一个特殊的 undefined 值。
任何函数在任何时候都能通过return语句后跟要返回的值实现返回值,位于return语句后的任何代码永不会执行。
2、参数
参数在内部用数组来表示,函数只接收数组。
通过arguments对象可以访问参数数组,其length属性获得参数数量。该长度由传入参数决定,而不是定义时命名的参数个数决定。
命名的参数只提供便利,但不是必须。
3、不能重载
由于不存在函数签名的特性,ECMAScript 函数不能重载。
如果在 ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数。
通过检查传入函数中参数的类型和数量并作出不同的反应,可以模仿方法的重载。
二、Function类型
函数实际上是对象,因此函数名实际上是指向函数对象的指针,不会与某个函数绑定。
每个函数都是Function类型的实例,与其他引用类型一样具有属性和方法。
1、定义函数的方式:
1.函数声明:
function sun(num1,num2){
statements;
}
2.函数表达式
var sum = function (num1,num2){
statements;
};
注意这里函数末尾有分号,因为是声明一个变量的语句。
3.Function构造函数
var sum = new Function (“num1”,“num2”,“return num1+num2”); //不推荐
2、函数声明和函数表达式的区别
解析器会率先读取函数声明,并使其在任何代码钱可用,即函数声明提升;
函数表达式则是声明变量,必须执行该代码行才能被引用和解释。
3、函数作为值传递
要访问函数的指针,而不执行函数,则需要去掉函数名后的圆括号。
4、函数内部属性
(1)arguments
类数组对象,包含传入函数的所有参数。它有一个callee属性,指向拥有这个arguments对象的函数,即arguments.callee
(2)this
this引用的是函数据以执行的环境对象。再网页全局调用函数时,this就是window
5、函数的属性和方法
ECMAScript中的函数是对象,因此也有属性和方法。
(1)属性
length:表示函数希望接收的命名参数的个数。functionName.length
prototype:是保存它们实例方法的真正所在。诸如toString()和ValueOf()等方法实际上都保存在其名下。
(2)方法
每个函数都包含2个非继承而来的方法:apply()和call()。用途是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。
apply()方法接收2个参数:在其中运行函数的作用域+参数数组
call()方法与apply()方法作用相同,区别在于接收参数方式不同。必须明确传入每个参数,逐个列举出来。
除了传递参数,主要作用是扩充函数赖以运行的作用域。好处是对象不需要与方法有耦合关系。
bind()方法:创建函数的实例,this值绑定到传给该函数的值。
三、闭包
这个地方看阮一峰写的文章发现非常清晰明了。http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。
1、执行环境及作用域
当某个函数被调用时,会创建一个执行环境及相应的作用域链。