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

arguments是一个类数组对象,包含着传入函数中的所有参数

在arguments中还存在着一个callee属性,该属性是一个指针,指向拥有这个arguments对象的函数。

下面是一个阶乘函数

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

但是这个函数的执行与函数名紧紧耦合在一起

<!DOCTYPE html>
<html>
<head>
    <title>Add Example 1</title>
</head>
<body>
    <script type="text/javascript">
        function factorial(num){
            if(num<=1){
                return 1;
            }else{
                return num*factorial(num-1);
            }
        }

        var trueFactorial=factorial;
        factorial=function(){return 0};
        alert(trueFactorial(5)); //0

    </script>
</body>
</html>

使用arguments.callee可以消除这个麻烦

<!DOCTYPE html>
<html>
<head>
    <title>Add Example 1</title>
</head>
<body>
    <script type="text/javascript">
        function factorial(num){
            if(num<=1){
                return 1;
            }else{
                return num*arguments.callee(num-1);
            }
        }

        var trueFactorial=factorial;
        factorial=function(){return 0};
        alert(trueFactorial(5)); //120

    </script>
</body>
</html>

函数内部的另一个特殊的对象是this,其行为与Java和C#中的this大致类似

换句话说:this引用的是函数据以执行的环境对象——或者也可以说是this值(当在网页的全局作用域中调用函数时,this对象引用的就是window)。

看下面的例子

<!DOCTYPE html>
<html>
<head>
    <title>Add Example 1</title>
</head>
<body>
    <script type="text/javascript">
       window.color="red";
       var o={color:"blue"};
       function sayColor(){
           alert(this.color);
       }
       sayColor();  //"red"
       o.sayColor=sayColor;
       o.sayColor(); //"blue"
    </script>
</body>
</html>

caller属性中保存着调用当前函数的函数的引用

如果是全局作用域中调用当前函数,它的值为null;

<!DOCTYPE html>
<html>
<head>
    <title>Add Example 1</title>
</head>
<body>
    <script type="text/javascript">
       function outer(){
           alert(outer.caller);     //null
           inner();
       }
       function inner(){
           alert(inner.caller);
       }
       outer();
    </script>
</body>
</html>

第一个警告框中显示null,因为outer方法是在全局作用域调用的

第二个警告框中显示outer()函数的源代码。因为outer()调用了inner(),所以inner.caller就指向outer()。为了实现更加宽松的耦合,也可以通过arguments.callee.caller来访问相同的信息。

<!DOCTYPE html>
<html>
<head>
    <title>Add Example 1</title>
</head>
<body>
    <script type="text/javascript">
       function outer(){
           alert(arguments.callee);      //outer的源代码
           alert(arguments.callee.caller);    //null
           inner();
       }
       function inner(){
            alert(arguments.callee);     //inner的源代码
           alert(arguments.callee.caller);    //outer的源代码
       }
       outer();
    </script>
</body>
</html>
时间: 2024-10-07 09:17:37

函数内部的两个特殊的对象:arguments和this的相关文章

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

一.函数内部属性 在函数内部,有两个特殊的对象:arguments和this.arguments是一个类数组对象,包含着传入函数中的所有参数,主要用途是保存函数参数.但这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数. function box(num) { if (num <= 1) { return 1; } else { return num * box(num-1); //一个简单的的递归 } } 对于阶乘函数一般要用到递归算法,所以函数

Delphi函数指针的两种定义(对象方法存在一个隐藏参数self,所以不能相互赋值)

delphi中经常见到以下两种定义 Type TMouseProc = procedure (X,Y:integer); TMouseEvent = procedure (X,Y:integer) of Object; 两者样子差不多但实际意义却不一样, TMouseProc只是单一的函数指针类型; TMouseEvent是对象的函数指针,也就是对象/类的函数/方法 区别在于类方法存在一个隐藏参数self,也就是说两者形参不一样,所以不能相互转换 这也就是为什么delphi中可以这样赋值 but

Javascript高级程序设计——函数内部属性与函数属性

函数内部属性 函数内部有两个特殊的属性arguments和this.其中,arguments是类数组对象,包含传入函数中的所有值,这个arguments还有一个属性:callee,这个属性是一个指针,指向拥有arguments的函数.而this据以引用的是函数执行环境对象. function fib(n){ if(n = 1){ return 1; }else{ return n * arguments.callee(n - 1); } } //这里利用函数内arguments的callees属

javascript——函数内部属性

1 <script type="text/javascript"> 2 //在函数内部有两个特殊的属性:arguments 和 this.arguments是一个类数组对象,包含传入的所有参数, 3 //但是这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数. 4 //请看经典的阶乘函数例子: 5 function Factorial(num) { 6 if (num <= 1) { 7 return 1; 8 } el

函数里的两个特殊对象

一.函数内部两个特殊的对象:1 arguments(数组对象) 2 thisfunction sum(num){ //阶乘,递归 return num*sum(num-1);}sum(4);--24function sum(num){ return num*arguments.callee(num-1);}sum(4)--24arguments.callee();调用自身,实现函数递归callee是arguments对象的属性,指向拥有这个arguments这个对象的函数. 二.window是个

2、函数内部属性 arguments是类数组对象,主要用途是保存函数参数,但这个对象中有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数

例如:(1).function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1); } }//此时是递归算法 var trueFactorial=factorial;//将factorial复制给trueFactorial factorial=function(){ return 0; }//覆盖factorial函数 alert(trueFactorial(5));//0;因为辞职factorial

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

函数是对象,有自己的属性和方法 .首先通过console下输出的函数属性方法来直观的看一下: 函数内部属性只要包括两个特殊的对象:arguments和this. 函数属性包括:length和prototype 函数方法(非继承)包括:apply()和call() 继承而来的函数方法:bind().toString().toLocaleString().valueOf() 其他的目前不熟,后面再补充 1. 函数内部属性 在函数内部,有两个特殊的对象,arguments和this. argument

函数内部属性:arguments和 this

在函数内部,有两个特殊的对象: arguments和 this. arguments是一个类数组对象,包含着传入函数中的所有参数, 主要用途是保存函数参数. 但这个对象还有一个名叫 callee的属性,该属性是一个指针,指向拥有这个 arguments对象的函数 . 1 function box(num){ 2 if(num <=1 ){ 3 return 1; 4 }else{ 5 return num*box(num-1); //一个简单的递归 6 } 7 } 8 alert(box(4))

C++中常函数内部的this指针也是const类型的

代码中碰到一个奇怪的现象,在同样的函数中调用this指针,结果却有一个无法通过编译 1 // 读取连接信息 2 void ThirdWizardPage::ReadConnection() 3 { 4 QFile file("oracle.passwd"); 5 if(!file.open(QIODevice::ReadOnly)) 6 { 7 QMessageBox::information(this, tr("打开文件失败"), 8 tr("错误原因: