4

我有一个在某些情况下没有声明的变量,我想在 jQuery 模板中使用它。这是我想要实现的目标,但它会引发 *payment_method is not defined* 异常:

{{if payment_method && (payment_method.id == $value.id)}}
    // this throws an exception when payment_method is undeclared!
{{/if}}

这有效:

{{if payment_method }}
    {{if payment_method.id == $value.id}}
        // nested works!
    {{/if}}
{{/if}}

但我不太喜欢嵌套解决方案,因为我经常使用它。我清楚地理解为什么第一种情况会引发错误,我正在寻找的是一种可能的解决方法,而无需求助于第二种解决方案。

这个问题可能归结为 js 中检查未声明/未定义变量的属性的问题。这有效:

if("undefined" !== typeof undefinedVariable) {
    // this works just fine also for undeclared variables
}

但这不是:

if("undefined" !== typeof undefinedVariable.property) {
    // this throws an exception
}

有任何想法吗?

4

6 回答 6

2

当使用未定义/未声明的变量时,它不会抛出任何异常,但使用它的属性会。这是它变得有点模糊的地方。

如果您通过typeof检查此未声明变量的存在,它的计算结果为false(至少我认为是这样,当它是唯一条件时会这样做......)并且不会继续检查进一步的条件。如果你只通过它的名字检查它是否存在,它的评估结果为假,但下一个条件仍然被评估......

无论如何,这不会引发任何异常:

if(typeof undeclaredVariable !== "undefined" && typeof undeclaredVariable.property !== "undefined") {
    // this works just fine
}

也没有:

if(typeof undeclaredVariable !== "undefined" && undeclaredVariable.property) {
    // this also works just fine but is shorter
}

但这确实:

if (undeclaredVariable && undeclaredVariable.property) {
    // the conditional clause does not stop at undeclaredVariable but also checks for undeclaredVariable.id where it throws an exception
}

在不了解如何评估条件的真正机制的情况下,我的问题的答案是(成功测试):

{{if typeof payment_method !== "undefined" && payment_method && (payment_method.id == $value.id)}}

编辑:使用未定义/未声明的变量会在 js 中引发异常,但在 jQuery tmpl 中不会。

js:

if (undeclaredVariable) {
    // throws an exception
}

jQuery tmpl:

{{if undeclaredVariable}}
    // evaluates to false, but does not throw an exception
{{/if}}
于 2012-04-12T11:47:52.063 回答
1

这是您需要的,以最佳方式工作。

    try {
         if (!! someVariable)
         {
           //its declared you can use it
         }
         else
         {
           //its not declared
         }                    

   }
   catch (e) {
         //its not declared
   }
于 2012-05-02T14:24:31.363 回答
0

js 中的问题是你需要先检查属性是否存在,然后才能针对它进行测试,所以它使条件变得有点混乱。

{{if payment_method && payment_method.id && (payment_method.id == $value.id)}}
于 2012-04-11T22:30:00.150 回答
0

您可以使用 hasOwnProperty 函数来检查对象上是否存在属性。请参阅https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/HasOwnProperty

于 2012-04-11T19:35:48.170 回答
0
var foo;  
var bar = 'defined';
try{
  if(someVariable === 'undefined') {
    console.log('undefined'); //foo
  }else{
    console.log('declare && defined'); //bar
  }
}catch (e){
  console.log('undeclared'); //undeclaredVariable
}
于 2016-12-09T03:59:39.280 回答
-1
{{if this.data.payment_method && this.data.payment_method.id == $value.id}}{{/if}}
于 2014-06-12T08:38:36.220 回答