js 的函数实际上是对象,每个 函数都是 Function 类型的实例,而且与其它引用类型
一样,有属性和方法。由于函数是对象,因此函数名实际上也是指向函数对象的指针
,不会与某个函数绑定.
基本定义函数方法
function sum(num1, num2)
{
alert(num1+num2);
}
调用 sum(1,2); // 3
用函数表达式定义
var sum = function(n1, n2){
alert(n1+n2);
};
调用
sum(10, 9); // 19
function 后面没有函数名,用函数表达式定义时,没有必要了,后面有一个分号,像
声明其它变量一样
使用 Function 构造函数(不推荐用)
var sum = new Function("n1", "n2", "return n1+n2");
调用方式:alert(sum(1, 7)); // 8
可以授受任意多个参数,但最后一个始终被当做函数体
由于函数名仅仅是指向函数的指针,所以函数名与包含对象指针的其他变量没有什么
不同,也就是说,一个函数可以有多个名字
例:
function sum(n1, n2)
{
return n1+n2;
}
alert(sum(10,2)); // 12
var anothersum = sum; // 没有括号,所以不是调用函数,而是访问函数指针
sum = null;
alert(anothersum(10, 89)); // 99
函数声明和表达式:
其实都差不多,只有一点最大的差别,如以下是声明:
alert(sum(10)); // 100
function sum(num)
{
return 10*num;
}
以下是表达式,会出错
alert(sum(10)); // 出错
var sum = function(num){
return num * 10;
}
表达式必须放在调用前,如下是正确的:
var sum = function(num){
return num * 10;
}
alert(sum(10)); // 100
函数名本身就是变量,所以函数也可以作为值来使用。也就是说,不仅可以像传递参
数一样传递函数给另一个函数,而且可以将一个函数作为另一个函数的结果返回,如
:
function functionCallSome(someFunction, arguments)
{
return someFunction(arguments);
}
var sum = function(num){
return num * 8;
};
alert(functionCallSome(sum, 10)); // 80
从一个函数返回另一个函数,用来改变 sort() 排序方法
function test(name)
{
return function(obj1, obj2)
{
var v1 = obj1[name];
var v2 = obj2[name];
if(v1 > v2)
{
return -1;
}else if(v1 < v2)
{
return 1;
}else
{
return 0;
}
}
}
var data = [{name:'lin', age: 20}, {name:"long", age:26}];
data.sort(test("age"));
alert(data[0].name);
函数内部两个特殊的对象:arguments 和 this
arguments 是保存函数的参数,这个对象有一个 callee 属性,该属性是一个指针,
指向拥有 arguments 对象的函数
如下的递归
function f(num)
{
if(num <= 1)
{
return 1;
}else
{
return num * f(num - 1);
}
}
如果函数名不变,没有问题
alert(5); // 120
=================================
function f(num)
{
if(num <= 1)
{
return 1;
}else
{
return num * arguments.callee(num - 1);
}
}
var ff = f;
f = function ()
{
return 0;
};
alert(ff(5)); // 120
this与java,也即与 PHP中类似,是函数在执行时所处的作用域
window.color = "red";
var o = {color:"blue"};
function sayColor()
{
alert(this.color);
}
sayColor(); // red
o.sayColor = sayColor; // 是指针,指向相同
o.sayColor(); // blue
每个函数都包含两个非继承的方法 apply()和 call(),用途都是在特定的作用域用调
用函数,实际上等于设置函数体内的 this值, apply()接受两个参数,一个是函数运
行的作用域,一个是参数数组
function sum(num1, num2)
{
return num1 + num2;
}
function callSum1(num1, num2)
{
return sum.apply(this, arguments); // 传入 arguments
}
function callSum2(num1, num2)
{
return sum.apply(this, [num1, num2]); // 传入 数组
}
alert(callSum1(1, 2)); // 3
alert(callSum2(10, 3)); // 13
==========================================
call(),方法一样,只不过是第二个参数必须是字符串形式的参数
function sum(num1, num2)
{
return num1 + num2;
}
function callSum2(num1, num2)
{
return sum.call(this, num1, num2); // 传入 参数
}
alert(callSum2(10, 3)); // 13
======================
call()/apply()还可以扩展函数运行的作用域
window.color = "red";
var o = {color: "blue"};
function sayColor()
{
alert(this.color);
}
sayColor(); // red
sayColor.call(this); // red
sayColor.call(window); // red
sayColor.call(o); // blue