这篇文章将为大家详细讲解有关JavaScript编程是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
处理缺陷与错误
A.严格模式
当启用了严格模式(strict mode)后,JS就会在执行代码时变得更为严格。只需在文件或函数顶部放置字符串“use strict”就可以启用严格模式了。
B.异常
1.异常是一种当代码执行中遇到问题时,可以触发(或抛出)异常的机制,异常只是一个普通的值。触发异常类似于从函数中强制返回:异常不只跑出到当前函数中,还会跳出函数调用方,走到当前执行流初次调用函数的位置。这种方式被称为“堆栈展开(Unwinding the Stack)”。
2.异常真正强大的地方在于你可以在堆栈上设置一个“障碍物”,当异常缩减堆栈到达这个位置时会被捕获。接着你就可以对异常进行一些处理,并使得程序从异常捕获点开始继续执行。
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/8.html
正则表达式
1.exec方法,如果无法匹配模式则返回null,否则返回一个表示匹配字符串信息的对象。字符串也有个match方法
2.字符串replace,第二个参数可以用函数
3.//gi,g表示全局,i表示不分大小写
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/9.html
模块
A.模块的好处
1.模块根据一些标准将程序划分为不同的代码块,每份代码都自成一个整体。
2.设计良好的模块可以提供外部代码访问所需的接口。定义良好的模块接口可以确保旧接口在模块更新后保持不变。对外提供的接口应该具有统一和内聚的特性。
B.使用函数作为命名空间
1.为了防止模块内部使用的变量会污染全局命名空间,我们将该模块包裹在函数中。
2.将命名空间函数放在一对圆括号中:如果表达式使用关键字function开头,表明这是一个函数表达式。但如果一个语句使用function开头,则将该语句看成一个需要函数名的函数声明,而非一个表达式,也就是说,我们无法在语句后面添加括号来调用该函数。
C.使用对象作为接口
对于代码量比较大的模块来说,定义一个对象,并在定义完需要导出的某些元素时,将这些元素添加到该对象的属性中。
D.与全局作用域分离
构造一个require函数,调用该函数时指定一个模块名称,该函数会装载模块文件(依赖于我们运行的平台)并返回合适的接口对象
E.将数据作为代码执行
不推荐eval,使用new Function(“参数名列表”,“函数体”)
F.接口设计
1.可预测性
2.可组合性
3.层次化接口
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/10.html
项目实战:开发编程语言
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/11.html
文档对象模型
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/12.html
处理事件
A.事件与DOM节点
addEventListener;removeEventListener;
B.传播
1.若段落和按扭都有事件处理器,则先执行最特殊的事件处理器(按扭的事件处理器)。也就是说事件向外传播,从触发事件的节点到其父节点,最后直到文档根节点。最后,当某个特定节点上注册的所有事件处理器按其顺序全部执行完毕后,窗口对象的事件处理器才有机会响应事件。
2.事件处理器任何时候都可以调用事件对象的stopPropagation方法,阻止事件进一步传播。
3.可以使用target属性来创建出特定类型事件的处理网络。event.target.textContent
C.默认动作
调用event.preventDefault,不执行默认的动作
D.焦点事件
focus和blur事件,不会传播!
E.脚本执行时间线
1.即使任何时候都可以触发事件,但同一文档中无法同时执行两个脚本。若一个脚本已经在运行,事件处理器和使用其他方法调度的代码会使该脚本等待执行。
2.若想放到后台进行,同时防止页面无响应,可以使用浏览器提供的Web Worker。
F.定时器
setTimeout,一定时间后执行,clearTimeout
setInterval,每隔一定时间循环执行,clearInterval
利用setTimeout可以进行事件降频
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/13.html
项目实战:平台游戏
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/14.html
使用canvas绘图
A.SVG
1.可缩放矢量图形,专用于描述图形文档而非描述文字文档,保存了对于聊天挖墙脚的基本信息的描述,可以随时移动或修改图像。
B.canvas元素
1.用于绘制二维图形的“2d”与通完openGL接口绘制三维图形的“webgl”
2.filleStyle决定了图形的填充方式
3.strokeStyle和lineWidth用来控制线条的绘制方式
4.fillRect和strokeRect来绘制矩形
5.fillText和strokeText绘制文字
6.beginPath创建一个新的路径,lineTo方法画一条直线,路径画完时可以使用fill填充或stroke勾勒轮廓
7.drawImage从一张图片或另一个画面上移动像素到我们的画布上
8.translate、scale与rotate进行图形变换,一个变换的状态可以通过save来保存,通过restore来恢复
9.clearRect可以在绘制动画时,清除画布的某一部分
C.选择图像接口
1.SVG可以被用来制造可以做任意缩放而仍然清晰的图像。比单纯的HTML更加难以使用,但是更加强大。
2.画布的基于像素的方法在需要绘制大量的微小元素时会有优势,不会构建新的数据结构 而是仅仅重复的在同一个像素上绘制,使得画布在每个图形上拥有更低的消耗。
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/14.html
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/15.html
HTTP协议概述
A.XMLHttpRequest对象
B.HTTP沙箱
请求头中包含Access-Control-Allow-Origin:*告诉其他域名发送请求是没问题的
C.Promise断言
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/16.html
表单和表单域
A.聚焦
在document.activeElement中的值会关联到当前聚焦的元素。通过focus和blur方法来控制聚焦
B.作为整体的表单
1.当一个域被包含在<form>元素中时,其DOM元素会有一个form属性指向form的DOM元素,<form>元素则会有一个叫作elements属性包含一个类似于数据的集合,其中包含全部的域
2.submit方法可以调用事件对象的preventDefault来禁用默认行为
C.文本域
selectionStart和selectionEnd属性包含光标和所选文字的信息。当没有选中文字时,这两个属性的值相同,表明当前光标的信息。当一部分域被选中时,这两个你属性值会不同,表明文字开始位置和结束位置
D.选择域
multiple可以多选,size用来设置同时可展示的选项,设置3显示3行,与multiple无关。<select>域有类似于数组的options属性
E.客户端保存数据
localStorage和sessionStorage,sessionStorage会在浏览器关闭时结束
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/17.html
项目实战:绘图程序
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/18.html
Node.js
A.node命令
1.变量process是Node中的全局变量,提供了process.exit方法(结束进程),process.argv(获取传递给脚本的命令行参数)
2.与浏览器相关的功能,如document与alert不存在在node中
3.全局作用域对象在浏览器中名为window,而在Node中则名为global
B.文件系统模块
1.fs:readFIle()、writeFile()、readdir()将目录中的文件以字符串数组的方式返回、stat函数用于获取文件信息、rename用于重命名、unlink用于删除
2.fs模块中的许多函数都有异步与同步的两种变体,如readFile的同步函数为readFileSync
C.流
1.可写流:所有的可写流都有一个write方法,可以传递字符串或Buffer对象。可写流的end方法用于关闭流,如果 线定一个参数,该方法会在关闭流前输出指定的一段数据。这两个方法都可以使用一个回调函数作为额外参数,当写入数据或关闭流完成后,会调用用户指定的回调函数。
2.可读流:data事件在每次数据到来时触发,end事件在流结束时触发。
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/19.js
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/19-1.js
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/19-2.js
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/garble.js
项目实战:技能分享网站
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/router.js
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/20.js
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/public/
JavaScript和性能
1.性能分析器:Chrome的Profiler
2.函数内联:函数内联通过许多方法来回忆代码运行速度。在机器级别,函数和方法需要使用一定的协议调用。
3.交叉编译:当编译热点函数时,该函数已经执行过了许多次。如果在这些执行过程中,每次都调用同一个函数,那么内联该函数就是合理的。
4.没有任何JS引擎能够内联forEach调用。可以使用传统的for循环来取代forEach
5.为什么对象如此昂贵呢?一是引擎需要寻找位置来有些话对象,二是引擎需要分别看v化学成分全局再也不需要使用而应该进行垃圾回收。Chrome使用世代型垃圾回收机制(Generational Garbage Collection)
6.如果你希望一段代码执行得足够快,那么最好保持类型一致。
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/21.js
关于JavaScript编程是怎样的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。