函数其实是对象,每一个函数都是Function类型的实例,且与其余类型同样具备属性和方法.因为函数是对象,故函数名即为指向函数的指针,正是因为这一点,函数没有重载,重复定义函数只会后者替换前者.javascript
函数的定义有三种:java
函数声明web
function sum(num1,num2){ return num1+num2; }
函数表达式数组
var sum=function(sum1,sum2){ return sum1+sum2; }
使用Function构造函数(不推荐使用)app
var sum=new Function('num1','num2','return num1 + num2;');
注:
函数声明和函数表达式的惟一区别是函数声明会提早.意即函数调用在函数声明以前能够正常运行.函数
前面提到函数是对象,因此函数也能够做为参数值或返回值.性能
//做为参数 function callSomeFunction(someFunction,someArgument){ reuturn someFunction(someArgument); } function add10(num){ return num+10; } var result=callSomeFunction(add10,10); alert(result); //20 //做为返回值 function createCompareFunction(propertyName){ return function(object1,object2){ var value1 = object1[propertyName]; var value2 = object2[propertyName]; if(value1 < value2){ return -1; } else if(value1 > value2){ return 1; } else{ return 0; } } }
在函数内部有两个特殊对象:arguments
this
arguments
是一个类数组对象,包含传入函数中的全部参数(这是其主要用途),除此以外,其还有一个callee的属性,该属性是一个指针,指向当前函数对象.this
引用的是函数据以执行的环境对象.在调用函数以前,this的值是不肯定的,当在全局对象中调用函数时,this引用的是全局对象window,当把函数赋值给某对象时,this指的是此对象.this
window.color = "red"; function sayColor(){ alert(color); } sayColor(); //red var o={color:'blue'}; o.sayColor = sayColor; o.sayColor();//blue
属性length
:函数但愿接收的命名参数的个数.prototype
:这是一个很是回味无穷的属性,它保存着函数的实例方法,意即到经过函数实例化获得的对象能够访问prototype中的方法.此属性在自定义引用类型和实现继承颇有用处.prototype
方法apply
call
这两个方法是函数的非继承方法.用途都是设置函数体内this对象的值.指针
apply
接收两个参数,第一个是运行函数的做用域,通俗的说就是将这个参数做为this指向的值.第二个参数是数组做为执行函数的参数.
function sum(num1,num2){ return num1+num2; } function callSum(num1,num2){ return sum.apply(this,arguments); } alert(callSum(10,10)); //20
call
接收的第一个参数也是运行函数的做用域,后面的参数也是传递给执行函数的参数,与apply
不一样的是,后面的参数并不是数组,而是逐个列举出来的.
function sum(sum1,sum2){ return sum1+sum2; } function callSum(num1,num2){ return sum.call(this,num1,num2); } alert(callSum(10,10)); //20
ECMAScript中的构造函数能够建立特定类型的对象.内置的构造函数(例如Array Object)会自动出如今执行环境中.构造函数的首字母应该以大写字母开头,从而区分非构造函数.
要建立新的实例,必须使用new操做符,穿件新的实例会经历如下四个步骤:
建立一个新对象
将构造函数的做用域赋值给新对象(所以this指向这个新对象);
指向构造函数中的代码.
返回新对象
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.sayName = function(){ alert(this.name); }; } var person=new Person('Mr pu',24,'web developer');
构造函数与普通函数的区别在于构造函数在实例化时加了new关键字.其它地方彻底同样.
重要提示
在经过构造函数实例化对象时,请勿把方法放在构造函数中,由于每一个函数(在这里指方法方法)都是对象,每次实例化一个对象时这个对象中会保存每一构造函数中的方法,这是很影响性能的.解决办法是把这些方法放在prototype属性中.