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());
转载于:https://www.cnblogs.com/wt-yy86/p/3561070.html
相关资源:javascript学习笔记之函数定义