在函数内部,有两个特殊的对象:arguments和this。其中,arguments在曾经介绍过,它是一个类数组对象,包含着传入函数中的所有参数。虽然arguments的主要用途是保存函数参数,但这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。
请看下面这个非常经舆的阶乘函数:
function factorial (num){
if (num<=1){
return 1:
}else{
return num * factorial(num-l)
}
}
南昌网站优化公司技术员认为定义阶乘函数一般都要用到递归算法;如上面的代码所示,在函数有名字,而且名字以后也不会变的情况下,这样定义没有问题。但问题是这个函数的执行与函数名factorial紧紧耦合在了一起。为了消除这种紧密耦合的现象,可以像下面这样使用argumnents.callee:
function factorial (num)(
if (num<=1){
return 1:}
else{
return num * arguments.callee (num-l)
}
}
在这个重写后的factorial()函数的函数体内,没有再引用函数名factorial。这样,无论引用函数时使用的是什么名字,都可以保证正常完成递归调用。例如:
var trueFactorial= factorial;
factorial= function()(
return 0:
);
alert(trueFactorial(5))j //120
alert(factorial (5)); //0
茌此,变量trueFactorial获得了factorial的值,实际上是在另一个位置上保存了一个函数的指针。然后,我们又将一个简单地返回0的函数赋值给factorial变量。如果像原来的factorial()那样不使用arguments.callee,调用trueFactorial()就会返回0。可是,在解除了函数体内的代码与函数名的耦合状态之后,trueFactorial()仍然能够正常地计算阶乘;至于factorial(),它现在只是一个返回0的函数。
函数内部的另一个特殊对象是this,其行为与Java和C#中的this大致类似。换句话说,this引用的是函数据以执行操作的对象——或者也可以说,this是函数在执行时所处的作用域(当在网页的全局作用域中调用函数时,this对象引用的就是window)。来看下面的例子:
windndow. color = "red";
var o = { color: "blue" };
function sayColor(){
alert(this.color);
}
sayColor(); //"red"
o.sayColor=sayColor;
o.sayColor(); //"blue"
上面这个函数sayColor()是在全局作用域中定义的,它引用了this对象。由于在调用函数之前,this的值并不确定,因此this可能会在代码执行过程中引用不同的对象。当在全局作用域中调用sayColor()时,this引用的是全局对象window;换句话说,对this.color求值会转换成对window.color求值,于是结果就返回了"red"。而当把这个函数赋给对象o并调用o.sayColor()时,this引用的是对象o,因此对this.color隶值会转换成对o.color求值,结果就返回了"blue"。
南昌网站建设公司工程师提示,读者一定要牢记函数的名字仅仅是一个包含指针的变量而已,因此,即是在不同的环境中执行,全局的sayColor()函数与o.sayColor()指向的仍然是同一个函数。
希望对广大站长或网站建设公司或从事企业网站建设的团队有所帮助,如对此不太理解的,可以与南昌网络公司百恒网络技术部联系。我们很高与广大站长和网站建设公司技术人员分享我们的技术和经验。