seajs 使用指南

Sea.js 提供了一个全局方法——define,用来定义一个 CMD 模块。

1
2
3
4
5
define(function(require, exports, module) {
    // 模块代码
    // 使用require获取依赖模块的接口
    // 使用exports或者module来暴露该模块的对外接口
})

定义好模块后,在页面引入 sea.js。为了让 sea.js 内部能快速获取到自身路径,推荐手动加上 id 属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<script src="http://path/to/seajs/1.2.0/sea.js" id="seajs"></script>
<script>
    seajs.use('./hello')

    // 可以带 callback
    seajs.use('./hello', function(hello) {
      hello.api()
    })
    
    // 也可同时(依次)加载多个模块
    seajs.use(['./hello', './world'], function(hello, world) {
      hello.api()
      world.api()
    })
</script>

相等与比较

1
2
3
4
5
6
7
8
9
"" == "0" // false
0 == "" // true
0 == "0" // true
false == "false" // false
false == "0" // true
false == undefined // false
false == null // false
null == undefined // true
" \t\r\n" == 0 // true
  • 0 is false
  • “” is false
  • undefined is false
  • null is false

setTimeout 和 setInterval 潜在错误

setTimeout 的第一个参数是函数对象,一个常犯的错误是这样的 setTimeout(foo(), 1000), 这里回调函数是 foo 的返回值,而不是 foo 本身。 大部分情况下,这是一个潜在的错误,因为如果函数返回 undefined, setTimeout 也不会报错。

正确方式:

1
2
3
4
5
6
7
8
9
function Foo() {
    this.value = 42;
    this.method = function() {
        // this 指向全局对象
        console.log(this.value); // 输出:undefined
    };
    setTimeout(this.method, 500);
}
new Foo();




当回调函数的执行被阻塞时,setInterval 仍然会发布更多的回调指令。在很小的定时间隔情况下,这会导致回调函数被堆积起来

最简单也是最容易控制的方案,是在回调函数内部使用 setTimeout 函数: