Vdt模板编译的结果,会添加如下代码

    1. function(obj) {
    2. var self = this.data, scope = obj;
    3. ....
    4. }

    vdt.render()方法这样调用模板函数

    1. var vdt = {
    2. render: function() {
    3. template.call(vdt, data);
    4. ...
    5. }
    6. }

    所以

    • this 模板中this指向vdt实例
    • self 模板中self指向渲染到模板的数据this.data
    • scope 模板中scope指向传入模板的数据data

    一般情况下,scope === self,但是当模板存在继承时就不相等了,例如:

      1. // @file ./layout.vdt
      2. console.log(self, this)
      3. <div>
      4. <p>scope.name: {scope.name}</p>
      5. <p>self.name: {self.name}</p>
      6. <p>this.data.name: {this.data.name}</p>
      7. </div>
      1. var layout = require('./layout.vdt');
      2. <t:layout name="Vdt" />
      1. var vdt = Vdt(template);
      2. vdt.render({
      3. name: 'Virtual-Dom'
      4. })

    上例中,self & this保持不变,但是scope等于继承layout时传入的数据{name: 'Vdt'}