JavaScript 在对象中声明的函数的递归调用

在浏览器的控制台中运行下面代码:

var obj = { 
  fn1: function (n) { 
    if (n > 3) {
       return; 
    } 
    console.log('n=' + n); 
    n++; 
    fn1(n); 
  } 
};
obj.fn1(0);

输出结果如下:

n=0

ReferenceError: fn1 is not defined

将 obj 的定义改为下面的代码(将上面的 fn1(n); 改为 arguments.callee(n); 或 this.fn1(n); 或 obj.fn1(n);),不会报错

var obj = { 
  fn1: function (n) { 
    if (n > 3) {
       return; 
    } 
    console.log('n=' + n); 
    n++; 
    arguments.callee(n); 
       // this.fn1(n);
       // obj.fn1(n);
  } 
};



我的理解:

直接写 fn1(n) ,这样调用的是全局作用域下声明的函数 fn1,由于我们没有在全局作用域中声明 fn1,所以抛出了错误。

使用 this.fn1(),调用当前作用域的 fn1,由于第一次调用时使用的是 obj.fn1,所以当前作用域为 obj,可以在 obj 中找到 fn1 ,正常执行。

下面代码可以说明直接写 fn1() 调用的是全局作用域下声明的 fn1,而不是当前作用域的上层作用域中的 fn1。

var obj = { 
  fn1: function () { 
    console.log('this is fn1'); 
  },
   innerObj: {
       fn2: function () { 
        console.log('this is fn2'); 
           fn1();
     }
   }
};
obj.innerObj.fn2();



上面代码的输出结果:

this is fn2

ReferenceError: fn1 is not defined



你可能感兴趣的:(JavaScript 在对象中声明的函数的递归调用)