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



转载于:https://my.oschina.net/suimaohua/blog/190532

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值