博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript 在对象中声明的函数的递归调用
阅读量:7022 次
发布时间:2019-06-28

本文共 983 字,大约阅读时间需要 3 分钟。

hot3.png

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

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

你可能感兴趣的文章
Java Bean + 注册验证
查看>>
通过mysql 插入一句话***
查看>>
centos 分区扩容
查看>>
JBoss EAP 6 monitoring using remoting-jmx and Zabbix
查看>>
邮件服务器
查看>>
OOAD-设计模式-原型模式
查看>>
Java FAQ(2)
查看>>
JavaScript常用事件总结
查看>>
squid在企业网中的应用
查看>>
主元素 Majority Element
查看>>
关于加密的一些笔记
查看>>
我的友情链接
查看>>
Oracle 数据库查看client的用户登录信息包括ip
查看>>
Kernel Trace System
查看>>
linux文件系统详解
查看>>
我的友情链接
查看>>
ibatis mybatis sql语句配置 符号不兼容 大于号 小于号
查看>>
Alipay 开源 SofaRPC
查看>>
jquery的extend与fn.extend
查看>>
自动化测试应该学什么
查看>>