code: function(ctx, frame, cb) {
                  // ... 如果是 .render(function () {})
                  if (typeof ctx === 'function') {
                      cb = ctx;
                      ctx = {};
                  } 
                  // ...? 什么场景使用了frame
                  else if (typeof frame === 'function') {
                      cb = frame;
                      frame = null;
                  }
  
                  return lib.withPrettyErrors(this.path, this.env.dev, function() {
                      // debugger;
                      this.compile();
  
                      // ... 当前作用域不是简单的Object对象，是Context类的实例，并且整合了blocks对象
                      // ...todo 整合了blocks对象的情景分析
                      var context = new Context(ctx || {}, this.blocks);
                      var syncResult = null;
  
                      frame = frame || new Frame()
  
                      this.rootRenderFunc(this.env, context, frame, runtime, cb || function(err, res) {
                          if (err) {
                              throw err;
                          }
                          syncResult = res;
                      });
  
                      return syncResult;
                  }.bind(this));
              }
docs: var t = nunjucks.compile('Hi {{tpl}}!'); t.render({ tpl: "James" });  ctx 是 { tpl: "James" }