对JavaScript中函数对象的理解
首先,来看一个求两个数的和的函数
function sum(num1,num2){
return num1 + num2;
};
alert(sum(1,2)); //3
这个函数很简单,但是如果要求三个数的和呢,很容易会想到再加一个参数num3,同时将返回值也加上num3,那么,求四个数的和,五个数的和呢?再用这种方式写肯定是不行的,其实,js中的函数内部有一个对象叫做arguments,它是一个类数组对象,里面保存着这个函数调用时传入的参数:
function sum(){
alert(arguments.length);
}
sum(1,2); //2
function testArgs(){
alert(arguments[0]);
}
testArgs(4,5); //4
知道了auguments之后,可以把这个函数该写成求任意个数字的和,只需要把这些数字传入函数即可:
function sum(){
var sum = 0;
for(var i =0 ; i < arguments.length; i++){
sum += arguments[i];
}
return sum;
}
alert(sum(1,2,3,4,5,6)); //21
alert(sum(1,2,3)); //6
再来看一个递归求和的例子,也就是通常我们见到的求1~n的和,最初的方法可以采用以下这种方式实现:
function sum(n){
if(n == 1){
return 1;
} else {
return n+sum(n-1);
}
}
alert(sum(5)); //15
有些时候由于命名冲突或者其他的一些原因,我们需要将函数重命名,由于采用了递归,所以函数内部代码中的函数名也要修改,问题在于一个是要修改两次,有些时候我们还会一遗忘..arguments对象有一个callee属性,代表arguments对象属于哪一个函数的,比如上面sum函数中arguments.callee就代表sum本身,所以,可以将代码修改成如下:
function sum(n){
if(n == 1){
return 1;
} else {
return n+arguments.callee(n-1);
}
}
alert(sum(5)); //15
现在,我们就不用去关心函数内部的代码了,降低了代码的耦合.
js是支持面向对象编程的,只是它没有类这个概念,有一种常用的方式就是通过构造函数+原型的方式来实现:
function Box(name,age){
this.name = name;
this.age = age;
}
var box = new Box("xwc",20);
alert(typeof box); //"object"
alert(box instanceof Box); //true
首先写一个很普通的函数Box(构造函数),它就相当于别的面向对象语言中的类,然后用new操作符来实例化一个Box,命名为box,现在box就是Box的一个实例,这点用instanceof可以证明(typeof 在检测基本类型的时候拿手,检测某个对象是谁的实例还是用instanceof吧),到这里,我相信很多人关心这一切的背后到底发生了什么,我查阅了一些资料,发现解释是这样的:使用new操作符之后,js引擎会在后台创建一个空对象,然后把自己的作用域赋给构造函数,接着执行函数中的代码,(你也可以理解成这个对象调用了构造函数,所以this指向的是这个对象),最后返回这个对象。
其实,关于函数的东西还有很多,例如函数的apply调用,call调用还有原型,这里一次描述完不太现实,另,由于本人水平有限,欢迎大家评论指错交流。
共同学习,写下你的评论
评论加载中...
作者其他优质文章