javascript 为什么这样会无限递归自己,从而造成死循环并且溢出?

供稿:hz-xin.com     日期:2024-05-02
前端怎么学习javascript

a) 框架。推荐jQuery,简单易用,我的第一web项目就是在w3school简单学习后,直接上手jQuery完成的,真的很难简单,很好用。jQuery适用环境有限,对于那些对性能要求很高的页面无法胜任。推荐了解一下 YUI 或百度的 tangram ,都很好用,学习方法也很简单,照着产品文档做几个页面就行了,不用面面俱到,以后遇到问题查文档就行了。框架可以帮你屏蔽浏览器的差异性,让你能更专注与web开发学习的精髓部分。
b) javascript 语言范式。这个名字可能并不恰当,只是我找不到可以描述“面向对象”,“函数式”这个两个概念的概念。javascript不完全是一个面向对象的语言,它的很多设计理念都有函数编程语言的影子,甚至说如果你不用面向对象,完全可以把它理解成一门函数式编程语言。javascript的很多语言特性,都是因为他具有函数是语言的特点才存在的。这部分推荐先学习面向对象的基本理论,对封装,继承,多态等概念要理解,维基百科,百度百科会是你的帮手,另外推荐《object oriented javascript》,应该有中文版。对与函数式编程我了解的也不系统,不好多说,可以自己百度一下。
c) javascript 语言内部机制。必须弄清如下概念:js中变量的作用域,变量传递方式,函数的定义环境与执行环境,闭包,函数的四种调用方式(一般函数,对象的方法,apply,call),以及四种调用方式下,‘this'指向的是谁。这部分内容你会在《javascript语言精粹》中详细了解。另外,你必须理解json。
d) dom编程,这个web前端工程师的核心技能之一。必读《dom编程艺术》,另外《高性能javascript》这本书中关于dom编程的部分讲的也很好。
e) ajax编程,这是另一核心技术。ajax建议在网上查些资料,了解这个概念的来龙去脉,百度百科,维基百科上的内容就足够了。真正编程是很容易的,如今几乎所有框架都对ajax有良好的封装,编程并不复杂。
f) 了解浏览器差异性。这部分包括css和js两部分,浏览器差异内容很多,建议在实践中多多积累。

  二级WEB程序设计考试大纲

  一、基本要求

  1. 掌握Web工作原理,了解Web技术基础知识,熟悉IIS的管理;

  2. 掌握静态网页设计技术,熟练掌握网页的HTML代码编写;

  3. 熟练掌握一种脚本语言(VBScript或JavaScript)的编程方法,具有较强的客户端动态设计的能力;

  4. 熟练掌握ASP工作原理和ASP编程方法,具有较强的服务器端动态设计的能力;

  5. 熟悉数据库的操作和SQL语言的运用,熟练掌握ADO工作原理,熟练运用ADO进行数据库的管理;

  6. 基本具有小型Web应用系统的综合设计能力。

  二、考试范围

 (一)Web技术基础

  1. Web工作原理:WWW概念和标准、W3C、Web客户端和Web浏览器、Web服务器端和Web服务器;

  2. TCP/IP协议、IP地址和域名服务;

  3. HTTP和URL: HTTP工作过程、HTTP Request、HTTP Response,URL;

  4. IIS的安装、配置和管理;

  5. 站点的规划、设计、发布和管理。

  (二)静态网页设计

  1.静态网页开发技术:页面设计原则、可视化页面设计工具(FrontPage或DreamWeaver)的运用;

  2.HTML代码:HTML基本语法、HTML常用标签;

  3.XML、DHTML、XHTML。

  (三)脚本语言和程序设计(脚本语言任选一种)

  1.VBScript:VBScript语法、VBScript数据类型、变量、常

  量、数组、运算符、表达式、内部函数、程序控制结构、Sub过程、Function函数,VBScript嵌入HTML;

  2.JavaScript:JavaScript语法、JavaScript数据类型及类型转换、变量、数组、操作符、表达式、函数、程序控制结构,JavaScript事件;JavaScript内置对象,对象层次及DOM模型,JavaScript嵌入HTML;

  (四)服务器端动态设计

  1.ASP工作原理;

  2. ASP编程:ASP文件的建立与运行,Response对象、Request

  对象、Session对象、Application对象、Server对象、使用Form集合、使用QueryString集合、使用Cookies集合、使用Clinet Certificate集合、文件存取组件FileSystemObject、 a文件;

  3.CGI、PHP、JSP的工作原理。

  (五)Web数据库应用

  1.Access数据库和SQL Server数据库的应用:数据库的建

  立、数据表的建立、数据的输入、修改、查询和删除等操作;

  2.SQL语言的应用:Select语句查询记录、Insert语句插入

  记录、Update语句修改记录、Delete语句删除记录;

  3.ODBC数据源的配置与管理:ODBC的概念、ODBC驱动程序、

  ODBC数据源的建立、ODBC数据源的配置与管理;

  4.ADO访问数据库:ADO工作原理,与ACCESS数据库的连接、

  与SQL Server数据库的连接,ADO的Connection对象、ADO的Recordset对象、ADO的Command对象;

  5.小型Web应用系统的综合设计

我先来解释无限递归

先举一个生活中的例子,就是那个经典的《老和尚给小和尚讲故事》的故事:
从前有座山,山里有个庙,庙里有个老和尚给小和尚讲故事。
讲的是什么故事呢?
讲的是:
从前有座山,山里有个庙……

这就是无限递归了。

再来说一下你的程序发生无限递归的原因:
ajQuery 是一个函数。执行这个函数时,函数中的 return 语句会返回一个值。
它会返回什么值呢?
返回值是执行一个新的 ajQuery 函数的返回值,
那么这个新的 ajQuery 函数会返回什么值呢?
这个新的 ajQuery 函数会返回又一个新的 ajQuery 函数的返回值,
……

这是无限递归,也是一种死循环。

最后说一下发生溢出的原因:
每次执行 ajQuery 函数,
都会在结束前执行又一个新的 ajQuery 函数,
并等待它结束,然后自身才能结束。
每执行一个函数都要占用一些资源,只有函数结束后才有可能释放这些资源。
可是,在无限递归过程中,不断地执行一个又一个函数,却从不结束这些函数。
所以,占用的资源就会越来越多。
直到占用的资源超出了允许的范围,就溢出了!


应该是判断逻辑有问题,系统不会误认为你进入了无限循环,除非你是真有死循环。如果可以贴代码。