函数内部属性之arguments和this

Posted zixian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数内部属性之arguments和this相关的知识,希望对你有一定的参考价值。

在函数内部,有两个特殊的对象:arguments和this。

1、arguments

  arguments是一个类数组对象。包含着传入函数中的所有参数。但这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。

  经典案例:阶乘函数

function factorial(num){
    if(num <= 1){
        return 1;
    }else{
        return num * factorial(num-1);
    }
}

定义阶乘函数一般都要用到递归算法,如上所示,但你会发现,这个函数的执行与函数名factorial紧紧耦合在了一起,为解决这个问题,我们可以使用arguments.callee。

function factorial(num){
    if(num <= 1){
        return 1;
    }else{
        return num * arguments.callee(num-1);
    }
}

我们重写之后,factorial()函数里没有引用函数名factorial。这样无论引用函数时使用的是什么名字,都可以保证正常完成递归调用。例如:

var trueFac = factorial;

factorial = function(){
    return 0;
}

console.log(trueFac(5));  // 120
console.log(factorial(5));  // 0

2、this

函数内部的另一个对象是this,this引用的是函数执行的环境对象(当在网页的全局作用域中调用函数时,this对象引用的就是window)。

window.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”。

函数的名字仅仅是一个包含指针的变量。

 

以上是关于函数内部属性之arguments和this的主要内容,如果未能解决你的问题,请参考以下文章

函数内部两个特殊的对象---arguments和this

函数内部的两个特殊的对象:arguments和this

JS学习之函数内部属性和方法

arguments.callee

装饰模式之AOP之动态改变参数,和原函数绑定属性丢失

JavaScript函数内部属性和函数方法