JavaScript拾荒

阅读过时书籍《Javascript 高级程序设计》、《Javascript DOM 编程艺术》挖点宝,考古。

JavaScript在XHTML中的兼容#

XHTML中使用嵌入JavaScript使用CDATA#

使用 CDATA 包裹代码来解决 XHTML 解析<``>``&等特殊符号出现问题。

使用 JavaScript 注释来支持 CDATA 块的非 XHTML 兼容浏览器。

下面这种格式适用于所有现代浏览器,虽然现在大多数浏览器已经没这种问题。

<script type="text/javascript">
//<![CDATA[
  function compare(a, b) {
    if (a < b) {
      console.log("A is less than B");
    } else if (a > b) {
      console.log("A is greater than B");
    } else {
      console.log("A is equal to B");
    }
}
//]]>
</script>

外部引用#

<script src="mainB.js"></script>
<script src="component3.js"></script>
<script src="component4.js"></script>
<script src="component5.js"></script>

无法使用JavaScript的时候给noscript提示#

脚本不可用时让浏览器显示一段话。如果浏览器支持脚本,则用户永远不会看到它。

<!DOCTYPE html>
<html>
  <head>
  <title>Example HTML Page</title>
  <script defer="defer" src="example1.js"></script> <script defer="defer" src="example2.js"></script> </head>
<body>
<noscript>
  <p>This page requires a JavaScript-enabled browser.</p> 
</noscript>
</body>
</html>

书写习惯#

在控制语句中使用代码块可以让内容更清晰,在需要修改代码时也可以减少出错的可能性。

// 有效,但容易导致错误,应该避免
if (test)
  console.log(test);

// 推荐
if (test){
  console.log(test);
}

let、var、const#

var#

if (true) {
  var name = 'Matt';
  console.log(name); // Matt
}
console.log(name); // Matt
  • 允许var重复声明,不允许在let之后重复声明
  • 声明会自动提升
  • 在全局作用域中声明的变量会成为 window 对象的属性
  • 在声明之后依然存在

let#

if (true) {
  let age = 26;
  console.log(age); // 26
}
console.log(age); // ReferenceError: age 没有定义
  • 不允许重复声明,不允许在var之后重复声明
  • 存在暂时性死区,不会自动提升
  • 在全局作用域中声明的变量不会成为 window 对象的属性
  • 只存在代码块内部

const#

  • 与let大致相同,不允许重复声明
  • 修改变量会导致运行时错误(只适用于它指向的变量的引用,object内部修改不受限)

所谓的“提升”(hoist),也就是把所有变量声明都拉到函数作用域的顶部

…持续更新