5.5 Function类型
函数名是指向函数对象的指针
1)、两种定义方式:
// 定义方式1
function sum(num1,num2) {
return num1 + num2;
}
// 定义方式2
var sum = function (num1,num2) {
return num1 + num2;
};
由于第二种定义方式是语句,所以在最后结尾处有加分号;
2)、图解函数名与对象的关系
3)、没有重载
函数没有重载,指的是多次定义函数时,后面定义的会覆盖前面的定义。对于有重载的,个人理解为如果出现多次定义就会提示出错;不提示出错就没有重载。
4)、函数声明与函数表达式
函数声明是这样的:
function sum(num1,num2) {
return num1 + num2;
}
函数表达式是这样的:
var sum = function (num1,num2) {
return num1 + num2;
};
对于函数声明,无论声明的语句在哪,系统都会先读入,再使用。所以声明语句可以在引用之后。
函数表达式就不同了,必须要先运行了该表达式,之后才能用引。
5.5.3 将函数作为值
function sum(num) {
return num + 10;
}
function callFunction(someFunction,someArgument) {
return someFunction(someArgument);
}
var res = callFunction(sum,1);
document.write(res); // 10 + 1
实际上是将两个函数嵌套在一起了:
function callFunction(someFunction,someArgument) {
return function sum(num) {
return num + 10;
};
}
对于多层次数据进行的排序,可采用下面的代码:
function createComparisonFunction(属性名) {
return function (obj1,obj2) {
var val1 = obj1[属性名];
var val2 = obj2[属性名];
if (val1 < val2){
return -1;
} else if (val1 > val2){
return 1;
} else {
return 0;
}
};
}
var data = [{name:"zachary",age:28},{name:"nicholas",age:29}];
data.sort(createComparisonFunction("name"));
alert(data[0].name); // nocholas
data.sort(createComparisonFunction("age"));
alert(data[0].name); // zachary
虽然这个代码不熟悉,但在其他语言中也见过,这个感觉比较重要,要用到的时候再来搜索。
5.5.4 函数内部的属性
1)、arguments.callee:代表拥有arguments对象的函数。
首先创建了以下的阶乘函数:
function 阶乘(n){
if (n <= 1){
return 1;
}else {
return n * 阶乘(n-1);
}
}
document.write(阶乘(5)); // 120
上述阶乘函数有两处用到了函数名,如果将外部函数名改为factorial,那么内部没有变化,调用的还是名为阶乘的函数,这样就是紧密耦合。
将内部的阶乘改为arguments.callee:
function factorial(n){
if (n <= 1){
return 1;
}else {
return n * arguments.callee(n-1);
}
}
document.write(factorial(5));
这个过程是能看明白的,但却意外地没运行成功,在callee出现了红色波浪线,显示出了这个错误:referencing 'claller' and 'callee' from arguments is not allowed.(注:因为代码中用了use strict)
2)、this
在不同的环境指代不同对象。