# ECMAScript Function 对象(类)
**ECMAScript 的函数实际上是功能完整的对象。**
## Function 对象(类)
ECMAScript 最令人感兴趣的可能莫过于函数实际上是功能完整的对象。
Function 类可以表示开发者定义的任何函数。
用 Function 类直接创建函数的语法如下:
```
var function_name = new function(_arg1_, _arg2_, ..., _argN_, _function_body_)
```
在上面的形式中,每个 _arg_ 都是一个参数,最后一个参数是函数主体(要执行的代码)。这些参数必须是字符串。
记得下面这个函数吗?
```
function sayHi(sName, sMessage) {
alert("Hello " + sName + sMessage);
}
```
还可以这样定义它:
```
var sayHi
=
new Function("sName", "sMessage", "alert(\"Hello \" + sName + sMessage);");
```
虽然由于字符串的关系,这种形式写起来有些困难,但有助于理解函数只不过是一种引用类型,它们的行为与用 Function 类明确创建的函数行为是相同的。
请看下面这个例子:
```
function doAdd(iNum) {
alert(iNum + 20);
}
function doAdd(iNum) {
alert(iNum + 10);
}
doAdd(10); //输出 "20"
```
如你所知,第二个函数重载了第一个函数,使 doAdd(10) 输出了 "20",而不是 "30"。
如果以下面的形式重写该代码块,这个概念就清楚了:
```
var doAdd = new Function("iNum", "alert(iNum + 20)");
var doAdd = new Function("iNum", "alert(iNum + 10)");
doAdd(10);
```
请观察这段代码,很显然,doAdd 的值被改成了指向不同对象的指针。函数名只是指向函数对象的引用值,行为就像其他对象一样。甚至可以使两个变量指向同一个函数:
```
var doAdd = new Function("iNum", "alert(iNum + 10)");
var alsodoAdd = doAdd;
doAdd(10); //输出 "20"
alsodoAdd(10); //输出 "20"
```
在这里,变量 doAdd 被定义为函数,然后 alsodoAdd 被声明为指向同一个函数的指针。用这两个变量都可以执行该函数的代码,并输出相同的结果 - "20"。因此,如果函数名只是指向函数的变量,那么可以把函数作为参数传递给另一个函数吗?回答是肯定的!
```
function callAnotherFunc(fnFunction, vArgument) {
fnFunction(vArgument);
}
var doAdd = new Function("iNum", "alert(iNum + 10)");
callAnotherFunc(doAdd, 10); //输出 "20"
```
在上面的例子中,callAnotherFunc() 有两个参数 - 要调用的函数和传递给该函数的参数。这段代码把 doAdd() 传递给 callAnotherFunc() 函数,参数是 10,输出 "20"。
注意:尽管可以使用 Function 构造函数创建函数,但最好不要使用它,因为用它定义函数比用传统方式要慢得多。不过,所有函数都应看作 Function 类的实例。
## Function 对象的 length 属性
如前所述,函数属于引用类型,所以它们也有属性和方法。
ECMAScript 定义的属性 length 声明了函数期望的参数个数。例如:
```
function doAdd(iNum) {
alert(iNum + 10);
}
function sayHi() {
alert("Hi");
}
alert(doAdd.length); //输出 "1"
alert(sayHi.length); //输出 "0"
```
函数 doAdd() 定义了一个参数,因此它的 length 是 1;sayHi() 没有定义参数,所以 length 是 0。
记住,无论定义了几个参数,ECMAScript 可以接受任意多个参数(最多 25 个),这一点在《函数概述》这一章中讲解过。属性 length 只是为查看默认情况下预期的参数个数提供了一种简便方式。
## Function 对象的方法
Function 对象也有与所有对象共享的 valueOf() 方法和 toString() 方法。这两个方法返回的都是函数的源代码,在调试时尤其有用。例如:
```
function doAdd(iNum) {
alert(iNum + 10);
}
document.write(doAdd.toString());
```
上面这段代码输出了 doAdd() 函数的文本。!
- JavaScript 基础
- JavaScript 简介
- JavaScript 使用
- JavaScript 输出
- JavaScript 语句
- JavaScript 注释
- JavaScript 变量
- JavaScript 数据类型
- JavaScript 对象
- JavaScript 函数
- JavaScript 运算符
- JavaScript 比较和逻辑运算符
- JavaScript If...Else 语句
- JavaScript Switch 语句
- JavaScript For 循环
- JavaScript While 循环
- JavaScript Break 和 Continue 语句
- JavaScript 错误 - Throw、Try 和 Catch
- JavaScript 表单验证
- JavaScript 保留关键字
- JavaScript JSON
- javascript:void(0) 含义
- JavaScript 高级
- JavaScript 对象
- JavaScript Number 对象
- JavaScript 字符串(String)对象
- JavaScript Date(日期)对象
- JavaScript Array(数组)对象
- JavaScript Boolean(逻辑)对象
- JavaScript Math(算数)对象
- JavaScript RegExp 对象
- JavaScript BOM
- JavaScript Window - 浏览器对象模型
- JavaScript Window Screen
- JavaScript Window Location
- JavaScript Window History
- JavaScript Window Navigator
- JavaScript 消息框
- JavaScript 计时
- JavaScript Cookies
- HTML DOM
- HTML DOM 简介
- HTML DOM 节点
- HTML DOM 方法
- HTML DOM 属性
- HTML DOM 访问
- HTML DOM - 修改
- HTML DOM - 修改 HTML 内容
- HTML DOM - 元素
- HTML DOM - 事件
- HTML DOM - 导航
- JavaScript HTML DOM EventListener
- AJAX 教程
- AJAX 简介
- AJAX 实例
- AJAX - 创建 XMLHttpRequest 对象
- AJAX - 向服务器发送请求
- AJAX - 服务器响应
- AJAX - onreadystatechange 事件
- AJAX ASP/PHP 请求实例
- AJAX 数据库实例
- AJAX XML 实例
- jQuery 基础
- jQuery 简介
- jQuery 安装
- jQuery 语法
- jQuery 选择器
- jQuery 事件
- jQuery 效果
- jQuery 效果 - 隐藏和显示
- jQuery 效果 - 淡入淡出
- jQuery 效果 - 滑动
- jQuery 效果 - 动画
- jQuery 停止动画
- jQuery Callback 函数
- jQuery - Chaining
- jQuery HTML
- jQuery - 获得内容和属性
- jQuery - 设置内容和属性
- jQuery - 添加元素
- jQuery - 删除元素
- jQuery - 获取并设置 CSS 类
- jQuery - css() 方法
- jQuery - 尺寸
- jQuery 遍历
- jQuery 遍历
- jQuery 遍历 - 祖先
- jQuery 遍历 - 后代
- jQuery 遍历 - 同胞
- jQuery 遍历 - 过滤
- jQuery - AJAX
- jQuery - AJAX 简介
- jQuery - AJAX load() 方法
- jQuery - AJAX get() 和 post() 方法
- jQuery 杂项
- jQuery - noConflict() 方法
- JavaScript 高级教程
- JavaScript 的历史
- JavaScript 实现
- ECMAScript 基础
- ECMAScript 语法
- ECMAScript 变量
- ECMAScript 关键字
- ECMAScript 保留字
- ECMAScript 原始值和引用值
- ECMAScript 原始类型
- ECMAScript 类型转换
- ECMAScript 引用类型
- ECMAScript 运算符
- ECMAScript 一元运算符
- ECMAScript 位运算符
- ECMAScript Boolean 运算符
- ECMAScript 乘性运算符
- ECMAScript 加性运算符
- ECMAScript 关系运算符
- ECMAScript 等性运算符
- ECMAScript 条件运算符
- ECMAScript 赋值运算符
- ECMAScript 逗号运算符
- ECMAScript 语句
- ECMAScript if 语句
- ECMAScript 迭代语句
- ECMAScript 标签语句
- ECMAScript break 和 continue 语句
- ECMAScript with 语句
- ECMAScript switch 语句
- ECMAScript 函数
- ECMAScript 函数概述
- ECMAScript arguments 对象
- ECMAScript Function 对象(类)
- ECMAScript 闭包(closure)
- ECMAScript 对象
- ECMAScript 面向对象技术
- ECMAScript 对象应用
- ECMAScript 对象类型
- ECMAScript 对象作用域
- ECMAScript 定义类或对象
- ECMAScript 修改对象
- ECMAScript 继承
- ECMAScript 继承机制实例
- ECMAScript 继承机制实现
- Google 地图API
- Google 地图API Key
- Google Maps 基础
- Google 地图叠加层
- Google 地图事件
- Google 地图控件集
- Google 地图类型
- Google 地图 API 参考手册
- 地图 API Map() 构造器
- 免责声明