已编译的 jst 模板中的 `this` 是什么
what is the `this` in a compiled jst template
当一个ejs文件编译时,它变成了一个javascript函数。比如这个ejs文件
<h3> Users Index</h3>
<ul>
<% users.each(function (user) { %>
<li><%= user.get("name") %></li>
<% })%>
</ul>
编译为这个 javascript 函数:
(function() { this.JST || (this.JST = {}); this.JST["users/index"] = function(obj){var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('<h3> Users Index</h3>\n\n<ul>\n '); users.each(function (user) { ; __p.push('\n <li>', user.get("name") ,'</li>\n '); }); __p.push('\n</ul>\n\n');}return __p.join('');};
}).call(this);
上面的javascript函数中,this
指的是什么? (即 backbone 视图等)
如果你运行一个像这样的自执行函数构造
(function() { console.log(this) }).call(this);
您会注意到它会输出(Chrome 控制台输出)
Window {external: Object, chrome: Object, document: document, i: undefined, StackExchange: Object…}
因此,所有这一切只是简单地将变量 JST
添加到全局 (window
) 命名空间,以便在每个后续脚本中都可以访问它。
行 this.JST || (this.JST = {});
将确保如果 window.JST
(window
= this
如我们所见)存在,如果不存在,则创建它,它的值将为空对象 (this.JST = {}
).
当一个ejs文件编译时,它变成了一个javascript函数。比如这个ejs文件
<h3> Users Index</h3>
<ul>
<% users.each(function (user) { %>
<li><%= user.get("name") %></li>
<% })%>
</ul>
编译为这个 javascript 函数:
(function() { this.JST || (this.JST = {}); this.JST["users/index"] = function(obj){var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('<h3> Users Index</h3>\n\n<ul>\n '); users.each(function (user) { ; __p.push('\n <li>', user.get("name") ,'</li>\n '); }); __p.push('\n</ul>\n\n');}return __p.join('');};
}).call(this);
上面的javascript函数中,this
指的是什么? (即 backbone 视图等)
如果你运行一个像这样的自执行函数构造
(function() { console.log(this) }).call(this);
您会注意到它会输出(Chrome 控制台输出)
Window {external: Object, chrome: Object, document: document, i: undefined, StackExchange: Object…}
因此,所有这一切只是简单地将变量 JST
添加到全局 (window
) 命名空间,以便在每个后续脚本中都可以访问它。
行 this.JST || (this.JST = {});
将确保如果 window.JST
(window
= this
如我们所见)存在,如果不存在,则创建它,它的值将为空对象 (this.JST = {}
).