defer 和 async 介绍

deferasync<script> 元素的两个属性,经常用来延迟执行脚本,只针对外部脚本文件,当 <script>src 属性不存在时,不能使用 deferasync

这两个均是布尔属性 (boolean attribute),也就是说,只要属性名出现就为 true,不管属性值为何。

<script src="my.js" defer></script>
<script src="my.js" defer="defer"></script>
<script src="my.js" defer="false"></script>
<!-- 三个均为 true -->

使用这两个属性都是为了减少等待脚本下载的时间。defer 是在 HTML4.0 中定义的,作用是将脚本延迟到页面解析完毕以后再执行,并且所有被延迟的脚本会按照原先的顺序执行。async 则是 HTML5 中引入的,作用是异步执行脚本,在等待脚本下载的同时继续解析页面,一旦下载完毕就立即执行。因此,使用 async 的脚本可能不会按照原先在文档中的顺序执行。这两个属性使用的规则如下:

  1. 只要 async 为 true,那么脚本异步执行 (一旦下载完毕立即执行)。
  2. 如果 async 为 false,defer 为 true,那么脚本在页面解析完毕以后执行。
  3. 如果 asyncdefer 均为 false,那么停止页面解析,直到脚本下载、执行完毕。

微软从 IE10 才开始支持 async,因此为了兼容,一般会同时使用两个属性,在不支持 async 的浏览器中会自动使用 defer

JavaScript 严格模式

ECMAScript 5 中引入了“严格模式”的概念,支持严格模式的浏览器包括 IE 10+、Firefox 4+、Safari 5.1+ 和 Chrome。严格模式执行更为严格的语法,代码的行为更加可靠,并且可以优化执行速度。对于之前一些静默失败的行为,在严格模式下会抛出明显的错误。

使用

要进入严格模式,需要在代码顶部添加一个字符串:

"use strict";

可以放在整个脚本的顶部,或是某个函数体的第一行。

function doSomething() {
  "use strict";
  // 整个函数以严格模式运行
}

变量

在严格模式下,不允许省略 var 关键字来创建全局变量。

message = "Hello World! ";
// 非严格模式:创建全局变量
// 严格模式:抛出 ReferenceError

其次,不能对变量调用 delete 操作符。非严格模式下允许这样操作,但会静默失败(返回 false)。而在严格模式下会抛出错误。

严格模式还增加了一些保留字:implementsinterfaceletpackageprivateprotectedpublicstaticyield,不能用其作为变量名,会抛出 SyntaxError。

对象

通过对象字面量创建对象时,不允许重名属性存在:

var person = {
                name: "Nicholas",
                name: "Greg"
             };
//非严格模式:以第二个属性为准
//严格模式:抛出 SyntaxError

在非严格模式下,后面的属性值会覆盖前面的同名属性。

函数

严格模式下,也不允许重名的参数:

function sum (num, num) {
  //do something
}

在非严格模式下,通过 num 只能访问第二个参数,要访问第一个需要通过 arguments 对象,而在严格模式下会抛出错误。
阅读全文 »

Date.parse() 的字符串格式

使用 JavaScript 中的 Date 构造函数创建一个日期对象,有以下几种方法:

 new Date();
 new Date(value);
 new Date(dateString);
 new Date(year, month [, day, hour, minute, second, millisecond]);

如果不传入参数,使用的是当前时间;如果想要使用一个特定的日期,需要传入从 1970 年 1 月 1 日起经过的毫秒数,或传入一个日期字符串,或者是详细的年月日。最后一种方法,使用的参数类型与 Date.UTC() 相同,注意年和月是必须的,月份是基于 0 的。

如果传入一个日期字符串,后台会调用 Date.parse() 进行解析,主要支持这些字符串格式:

  • 短日期,遵循月/日/年顺序,分隔符可用 - 或 /。如 "11/03/2013" 或者 "11-03-2013"
  • 长日期:年月日按任何顺序排列,用 , 或空格分隔。如 "November 3, 2013" 或者 "2013 November 3"。月份可以简写,如 "Nov 3 2013"
  • 以上日期后面可以加上时间,格式 hh:mm:ss,如 "11/03/2013 10:30" 或者 "Nov 3, 2013 10:30:24"
  • ISO 日期格式,格式为 YYYY-MM-DDTHH:mm:ss.sssZ。其中的 T 为分隔,前面表示日期后面表示时间。日期中的年份是必需的,如 YYYYYYYY-MMYYYY-MM-DD。后面 sss 是毫秒数,从 00 到 999,Z 表示 UTC 时间。如果指定了时间,其中的秒和毫秒可以省略。Z 也是可以省略的。一些合法的字符串格式:"2013""2013-11-03""2013-11T10:30""2013-11-03T10:30:02.666Z"

最后一种格式是 ECMAScript 5 中定义的,所以 IE 6-8 中无法使用。

参考文章:

flight