一般来说,你不能用_.isDefined
这个。考虑这个模板:
<script id="t" type="text/x-underscore-template">
<% if(!_.isUndefined(elementClass)) { %>
<%= elementClass %>
<% } else { %>
No such thing.
<% } %>
</script>
这个代码:
var t = _.template($('#t').html());
console.log(t({ }));
调用t
应该给你一个 ReferenceError 因为编译的模板函数没有elementClass
作用域。因此,如果您的对象根本没有elementClass
属性,那么当您尝试获取模板时模板函数将失败。
演示:http: //jsfiddle.net/ambiguous/H22D2/
问题是该_.isUndefined
函数只能检查表达式的值,它无法检查with
您传递给它的变量(或由于模板的内部使用而导致的属性)是否已声明。
如果对象将具有elementClass
属性但它可能具有未定义的值,那么您可以使用_.isDefined
:
t({ elementClass: undefined })
会好的。
演示:http: //jsfiddle.net/ambiguous/LUakg/
如果对象可能有也可能没有elementClass
属性,那么你会被困住使用typeof
astypeof
不会尝试评估其操作数。像这样的东西:
<script id="t" type="text/x-underscore-template">
<% if(typeof elementClass !== 'undefined') { %>
<%= elementClass %>
<% } else { %>
No such thing.
<% } %>
</script>
在所有三种感兴趣的情况下都可以正常工作:
var t = _.template($('#t').html());
console.log(t({ }));
console.log(t({ elementClass: undefined }));
console.log(t({ elementClass: 'pancakes' }));
演示:http: //jsfiddle.net/ambiguous/H5xC7/