Function 类型, 函数事件上是对象, 每个函数都是 Function 类型的实例, 而且都与其他引用类型一样都有属性和方法, 由于函数是对象, 因此函数名实际上也是一个指向函数对象的指针, 不会与某个函数绑定, 通常的函数使用函数声明语法定义 function sum(num1,num2){
retrun num1+num2;
} 推荐使用
- var sum = function(num1,num2){
- return num1+num2;
- };
这种是定义了变量 sum 并将其初始化为一个函数. 其 function 关键词后面没有函数名, 这是因为在使用函数表达式定义函数时, 没有必要使用函数名通过变量 sum 即可以引用函数末尾加分号, 就行声明其他变量时一样.
最后一种定义函数的方式是使用 Function 构造函数. Function 构造函数可以接受任意数量的参数, 但最后一个参数始终都被看成是函数体, 而前面的参数则枚举出了新函数的参数 (不推荐使用)var sum= new Function("num1","num2","return num1+num2"); 不推荐使用是因为这种定义函数, 这种语法会导致解析两次代码 (第一次是解析常规的 ECMAScript 代码, 第二次是解析传入构造函数中的字符串), 从而影响性能.
函数是对象, 函数名是指针
函数声明与函数表达式解析器在向执行环境中加载数据时, 对函数声明和函数表达式并非一视同仁, 解析器会率先读取函数声明, 并使其在执行任何代码之前可用 (可访问). 至于函数表达式, 则必须等到解析器执行到它所在的代码行才会真正被解析执行.
作为值的函数因为 ECMAScript 中的函数名本身就是变量, 所有函数可以作为值来使用,
- function callFunction(someFunction,someArgument){
- return someFunction(someArgument);
- }
- function addOne(value1){
- return value1+1;
- }
- var rel=callFunction(addOne,2);
- alert(rel);
函数声明与函数表达式函数声明和函数表达式的区别在于解析器在向执行环境加载数据时, 对函数声明和函数表达式并不是一视同仁的, 解析器会率先读取函数声明, 并使其在执行任何代码之前可用 (可用访问). 函数声明在代码开始执行之前, 解析器就已经通过一个名为函数声明提升的过程, 读取并将函数声明添加到执行环境中. 对代码求值时, JavaScript 引擎在第一遍会声明函数并将它们放到源代码树的顶部.
函数属性和方法 ECMAScript 中的函数是对象, 因此函数也有属性和方法. 每个函数包含两个属性: length 和 prototype.
length 属性表示函数希望接收的命名参数的个数
prototype 是保存它们所以实例方法的真正所在. prototype 属性极为重要, prototype 属性不可枚举.
每个函数都包含两个非继承而来的方法: apply() 和 call(). 这两个方法的用途都是在特定的作用域中调用函数实际上等于设置函数体内 this 对象的值.
apply() 接收两个参数一个是在其中运行函数的作用域, 另一个是参数数组其中第二个参数可以是 Array 的实例也可以是 arguments 对象.
来源: http://www.qdfuns.com/note/49226/38f85fec1b294b75161378b7b3efe2ec.html