Function类
1,每个函数都是Function类型的实例对象,函数名只是指向该实例对象的指针。
2,由于函数名是只想函数对象的指针,所以js中没有类似其他面向对象语言(C#/JAVA)中的重载。如下面代码
function
a(num) {
return num +
100;
}
function a(num1, num2) {
return num1 + 200;
};
alert(a(100));
前面的函数会被后面的函数覆盖。
3,既然函数是一个对象,那么可以将函数当做值来传递。如下所示
给对象排序
var object1
= { name: ‘张三‘, age: 10 };
var object2 = { name: ‘李四‘, age: 20 };
var object3 = { name: ‘王五‘, age: 5 };
var t = [object1, object2, object3];
t.sort(SortObj(‘age‘));
alert(t[0].age+":"+t[1].age+":"+t[2].age);
function SortObj(objPropet) {
return function (obj1, obj2) {
if (obj1[objPropet] > obj2[objPropet]) return
1;
else if
(obj1[objPropet] <obj2[objPropet]) return -1;
else return 0;
}
}
调用sort方法时需要给其传一个比较函数,给对象进行排序时需要按对象的某个属性进行排序。
定义一个函数(SortObj)它接受一个参数(objPropet),并返回一个按对象属性排序的比较函数
4,函数的内部属性 (argument、this对象,caller属性)
(1)argument对象除了保存传入函数参数的值还有一个比较重要的属性callee,该属性是一个指针,指向拥有该argument对象的函数。如阶乘的例子
function
factor(num) {
if (num
<= 1) return 1;
else {
return num
* arguments.callee(num - 1);
}
}
(2)this对象就是引用函数,据已执行的环境对象
(3)caller属性保存着调用当前函数的函数的引用
function a()
{
b();
}
function b() {
alert(arguments.callee.caller);
}
a();//返回的是a()函数的源代码
5,每个函数都有length和prototype属性
1)length属性表示函数希望接收的参数的个数。
2)prototype属性是保存函数所有实例方法的真正所在。
6,每个函数都包含两个非继承而来的方法apply()、call()和bind方法
1)apply()、call()的用途都是在特定的作用域中调用函数。
apply()方法接受两个参数一个是指定运行函数的作用域,一个是函数参数数组argument,参数array也行
call()方法第一个参数是指定运行函数的作用域,其他参数按函数参数逐个传递
function
sum(s1, s2) {
alert(this);
return s1 + s2;
}
alert(sum.call(this,
1, 2));
第一次弹出的是window对象,第二次是3
2)bind()方法会创建一个函数的实例,其this值会被绑定到传给bind函数的值(IE9+,Firefox4+,Chrome,Opera 12+,Safari 5.1+)
var obj1 = {
name: ‘张三‘, age: 10 };
function a() {
alert(this.name);
}
var p =
a.bind(obj1);
p();//弹出张三
7,函数继承的toLocaleString()、toString(),valueOf()方法返回的是函数代码,调试的时候有用。这几个方法的区别
function
sum(s1, s2) {
this.bb();
return s1
+ s2;
}
sum = [1,new
Date(),3];
alert(sum.toLocaleString());
alert(sum.toString());
alert(sum.valueOf());