函数实际上是对象,每个函数都是Function类型的实例,且与其他类型一样具有属性和方法.由于函数是对象,故函数名即为指向函数的指针,正是由于这一点,函数没有重载,重复定义函数只会后者替换前者.
函数的定义
函数的定义有三种:
注: 函数声明和函数表达式的唯一区别是函数声明会提前.意即函数调用在函数声明之前可以正常运行.
作为值的函数
前面提到函数是对象,所以函数也可以作为参数值或返回值.
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指的是此对象.
var o={color:'blue'};
o.sayColor = sayColor;
o.sayColor();//blue
函数的属性和方法
属性
length :函数希望接收的命名参数的个数.
prototype :这是一个非常耐人寻味的属性,它保存着函数的实例方法,意即到通过函数实例化得到的对象可以访问prototype中的方法.此属性在自定义引用类型和实现继承很有用处.
方法
apply call 这两个方法是函数的非继承方法.用途都是设置函数体内this对象的值.
apply 接收两个参数,第一个是运行函数的作用域,通俗的说就是将这个参数作为this指向的值.第二个参数是数组作为执行函数的参数.
call 接收的第一个参数也是运行函数的作用域,后面的参数也是传递给执行函数的参数,与apply 不同的是,后面的参数并非数组,而是逐个列举出来的.
构造函数
ECMAScript中的构造函数可以创建特定类型的对象.内置的构造函数(例如Array Object)会自动出现在执行环境中.构造函数的首字母应该以大写字母开头,从而区分非构造函数. 要创建新的实例,必须使用new操作符,穿件新的实例会经历以下四个步骤:
创建一个新对象
将构造函数的作用域赋值给新对象(因此this指向这个新对象);
指向构造函数中的代码.
返回新对象
var person=new Person('Mr pu',24,'web developer');
构造函数与普通函数的区别在于构造函数在实例化时加了new关键字.其它地方完全一样.
重要提示 在通过构造函数实例化对象时,请勿把方法放在构造函数中,因为每个函数(在这里指方法方法)都是对象,每次实例化一个对象时这个对象中会保存每一构造函数中的方法,这是很影响性能的.解决办法是把这些方法放在prototype属性中. (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|