一、概念
Function(函数)类型实际上是对象。每个函数都是 Function 类型的 实例,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也 是一个指向函数对象的指针
二、作为值的函数
ECMAScript 中的函数名本身就是变量,所以函数也可以作为值来使用。也就是说,不 仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数 的结果返回。
function box(sumFunction, num){
return sumFunction(num);
}
function sum(num) {
returnnum+10;
}
varresult=box(sum,10);
三、函数内部属性
- arguments
function box(num){
if(num<=1){
return 1;
}
else{
return num*arguments.callee(num-1);//使用 callee 来执行自身 等同于returnnum*box(num-1);
}
}
- this
window.color='红色的'; //全局的 或者写成var color = '红色的'
alert(this.color); //打印全局的 color
var box={
color:'蓝色的', //局部的 color
sayColor :function(){
alert(this.color); //此时的 this 只能 box 里的 color
}
};
box.sayColor(); //打印局部的 color
alert(this.color); //还是全局的
四、函数属性和方法
- length 属性表示函数希望接收的命名参数的个数
functionbox(name,age){
alert(name+age);
}
alert(box.length);
-
prototype 属性 (原型)
为一个特定类声明通用的变量或者函数。function Test(){ } alert(Test.prototype); // 输出 "Object"
-
用prototype给对象 添加属性
function Fish(name, color){
this.name=name;
this.color=color;
}
Fish.prototype.livesIn="water";
Fish.prototype.price=20;
- 用prototype给对象添加函数
function Employee(name, salary)
{
this.name=name;
this.salary=salary;
}
Employee.prototype.getSalary=function getSalaryFunction()
{
return this.salary;
}
Employee.prototype.addSalary=function addSalaryFunction(addition)
{
this.salary=this.salary+addition;
}
-
每个函数都 包含这两个非继承而来的方法。apply()和 call()
var color='红色的'; //或者 window.color='红色的';
var box={
color:'蓝色的'
};
function sayColor(){
alert(this.color);
}
sayColor(); //作用域在 window
sayColor.call(this); //作用域在 window
sayColor.call(window); //作用域在 window
sayColor.call(box); //作用域在 box,对象冒充
注:
使用 call()或者 apply()来扩充作用域的最大好处,
就是对象不需要与方法发生任何耦合 关系(耦合,
就是互相关联的意思,
扩展和维护会发生连锁反应)。
也就是说,
box 对象和 sayColor()方法之间不会有多余的关联操作,
比如 box.sayColor=sayColor;
网友评论