javaScript:脚本语言,最初是为了实现在客户端进行的表单验证以减少服务器的数据交互次数,如今可用在页面交互,计算,拥有了闭包,匿名(拉姆达)函数,甚至元编程等特性。
javaScript实现的组成:
1.核心(ECMAScript)--TC39负责完成的新脚本的语言标准。
2.文档对象模型(DOM)--针对XML但经过扩展用于HTML的API,DOM把整个页面为一个多层节点结构。
3.浏览器对象模型(BOM)--控制浏览器显示页面以外的部分。BOM无标准遵循。
javaScript的基本使用:
向html页面插入javaScript的方法即使用<script>标签,<script>标签的6大属型如下
async | 可选,表示应该立即下载该脚本,但不妨碍页面的其他操作。只对外部脚本有效 |
charset | 可选,通过src指定字符集,由于大多数用户代理会忽略这个值,所以基本不用这个属性 |
defer | 可选,表示脚本需要等到文档完全被解析和显示之后再执行,只对外部脚本有效 |
language | 已废弃 |
src | 可选,指定外部文件的路径 |
type | 可选,类似language,表示编写代码使用的脚本语言的内容类型(MIME),默认为text/javascript |
一个简单的示例
<script type="text/javascript"> function re(){ alert("hello javascript"); } </script>
script标签内的js代码会被自上向下的解释,如上,解释器会解释一个函数的定义,然后将该定义保存在自己的环境中,在解释器对<script>标签内的所有代码求值完毕以前,页面中的其余部分不会被浏览器加载或者显示。
*script标签在结束前不能出现</sciprt>,但是可以使用转义字符<\/script>来实现。
外部js,对使用src属性的script标签,不允许在其中嵌入js代码,如果这样,则嵌入的代码会被忽略,只运行src加载的外部js。
对于外部js,只要没有async,defer属性,则js在按照页面中出现的先后顺序顺序解析,就是第一个js解析完成后,再解析第二个。
标签的位置
传统做法:放在html的head元素中,这样的做法意味着浏览器必须等到所有的js代码下载,解析,执行后才能呈现页面的内容(浏览器遇到body标签才开始呈现内容),这将会导致页面在js为准备完毕前处于空白状态,没有良好的用户体验。
为了避免上述问题,现在一般将script放在</body>之前,页面内容之后。
再回到上面讲的defer属性,当defer的值为defer时,即为一个延迟脚本,顾名思义,该脚本会立即被下载,但延迟到浏览器遇到</html>时才被解析和执行,当存在多个延迟脚本时,文档中的延迟脚本按照出现的先后顺序解析与执行,但这些脚本会先与DOMContentLoaded事件执行。
现在来说异步脚本,async="async",异步,即在下载该脚本的同时,不用影响其他操作,如下载其他脚本,但是对于多个异步脚本,并非像defet一样按照顺序执行,另外对于异步脚本,最好不要加载其间修改DOM,异步一定会在页面的load事件之前执行,但可能会在DOMContentLoaded事件触发之前或者之后执行。
混杂模式:也叫怪异模式,即在WEB发展的早期,各浏览器厂商比较封闭,使用自己的体系,毫无兼容性可言,此时的网站多为混杂模式,当标准推行之后,便出现了标准模式。
<noscript>标签,实现不支持javascript的浏览器的平稳退化,其出现位置是作为body的相邻兄弟元素,在<script>标签之前闭合。