先看下基本的一些技巧:

// UMD (Universal Module Definition)
(function (root) {
    if (typeof define === 'function' && define.amd) {
        // AMD
        define([], function () {
            return TWEEN;
        });
    } else if (typeof module !== 'undefined' && typeof exports === 'object') {
        // Node.js
        module.exports = TWEEN;
    } else if (root !== undefined) {

        // Global variable
        root.TWEEN = TWEEN;
    }
})(this);

1. 基础语法和语言特性的使用

(function(){})();
这种写法, 关键词是: 闭包,自执行,但这里为什么要这么写呢? 其实直接执行function内的语句, 我觉得应该也是可行的, 比如改成下面的:
if (typeof define === 'function' && define.amd) {
    // AMD
    console.log(1);
} else if (typeof module !== 'undefined' && typeof exports === 'object') {
    // Node.js
    console.log(2);
} else if (root !== undefined) {
    // Global variable
    console.log(3);
}

2.1 typeof define === ‘function’ && define.amd

这一句, 判断了是否使用了require.js, 答案在这里:[跳转](https://stackoverflow.com/questions/30953589/what-is-typeof-define-function-defineamd-used-for "跳转")

2.2 typeof module !== ‘undefined’ && typeof exports === ‘object’

module应该是Nodejs中的定义, 

2.3 root !== undefined

传进来的this, 既然不为空, 那么就是有这个值了, 所以就是浏览器环境this == window,在浏览器里结果是true

之前的一些代码, 是TweenJs中兼容性的处理, 我们看下核心代码:

// Tween.js 源码
var _Group = function () {......};
_Group.prototype = {......};
var TWEEN = new _Group();
TWEEN.Tween.prototype
{

    update: function update(time) {}
}

// 使用前, 我们的准备工作, 需要在我们的代码里无限调用这个, time是代码执行时间,也就是渲染帧数的一帧时间
TWEEN.update(time);
// 怎么使用看3.2

3.2 使用

跳转