JavaScript学习笔记(函数基础知识)

 

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());

         

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。