JavaScript高级程序设计(第三版),个人的读书笔记.
在JS函数内部,有两个特殊的对象:arguments和this,我们先讲下arguments。
arguments是一类数组对象,包含着输入函数中的所有参数。除此之外还有一个callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。
举一个阶乘的例子文件命名为factorial.js(在nodejs下检验js输出结果):
function factorial(num) { if(num <= 1) { return 1; }else{ return num * factorial(num - 1); }}//同样效果的:function factorial(num) { if(num <= 1) { return 1; }else{ return num * arguments.callee(num-1); }}
这种写法主要为了函数的解耦,重写的函数,无论引用函数时使用的是什么名字,都可以保证正常的完成递归调用。
看下面两段代码的执行结果:
//第一段代码function factorial(num) { if(num <= 1) { return 1; }else{ return num * factorial(num - 1); }}var trueFactorial = factorial;factorial = function() { return 0;}console.log(trueFactorial(5));console.log(factorial(5));//运行结果是//0//0变量trueFactorial获取了factorial值,实际上实在另一个位置上保存了一个函数的指针,然后我们又将简单的返回0的函数复制给factorial变量.所以在trueFactorial执行时,内部的factorial已经是被重写了.所以输出0 0结果~
//第二段代码function factorial(num) { if(num <= 1) { return 1; }else{ return num * arguments.callee(num-1); }}var trueFactorial = factorial;factorial = function() { return 0;}console.log(trueFactorial(5));console.log(factorial(5));//运行结果是://120//0
函数只是会调用自身,后面的变量复制的函数不会去覆盖掉factorial的中的调用,所以运行结果是我们想要的.