函数实际上是对象,每一个函数都是Function范例的实例,且与其他范例一样具有属性和要领.由于函数是对象,故函数名即为指向函数的指针,恰是由于这一点,函数没有重载,反复定义函数只会后者替代前者.
函数的定义
函数的定义有三种:
函数声明
function sum(num1,num2){
return num1+num2;
}
函数表达式
var sum=function(sum1,sum2){
return sum1+sum2;
}
运用Function组织函数(不引荐运用)
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指的是此对象.
window.color = "red";
function sayColor(){
alert(color);
}
sayColor(); //red
var o={color:'blue'};
o.sayColor = sayColor;
o.sayColor();//blue
函数的属性和要领
属性
length
:函数愿望吸收的定名参数的个数.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属性中.