因为“未定义”的概念不同于 JavaScript 语言中定义的变量的状态。这样做的原因是可以理解的,但效果可能会令人困惑,尤其是在变量名与对象属性方面。
您已经演示了如何尝试访问未定义的变量会引发异常。不要将此状态(未定义变量)与“未定义”类型混淆:
if (bogusVariable) { // throws ReferenceError: bogusVariable is not defined.
typeof(bogusVariable); // => undefined - wow, that's confusing.
但是,可以安全地测试未定义对象的属性:
var x = {}; // an object
x.foo; // => undefined - since "x" has no property "foo".
typeof(x.foo); // => undefined
if (!x.foo) { /* true */ }
您可以通过注意所有变量实际上是“全局”对象(Web 浏览器中的“全局”或“窗口”)的属性来利用此属性。
bogus; // => ReferenceError: bogus is not defined.
global.bogus; // => undefined (on node/rhino)
window.bogus; // => undefined (on web browsers)
因此,您也许可以这样编写 EJS 代码:
<% if (global.test) { %>
<p><%= test %></p>
<% } %>
是的,这很令人困惑,JavaScript 语言的许多部分也是如此。