0

我有一个 <iframe> 使用在父文档的对象文字中设置的一些变量。这些变量是可选的;如果它们已设置,我想使用它们的值,将它们分配给更简洁的全局变量;如果没有,我想调用函数error()。

首先,这个三元运算符语句对我想做的事情有效吗?这里有什么潜在的陷阱吗?

parent.settings.account ? var account = parent.settings.account : error();

其次,是否有更简洁的方式来编写该语句?

其中一些变量是可选的,但如果定义,则具有可接受的值范围。什么是处理这个问题的可靠方法?像这样的东西?

if (parent.settings.polling_interval && parent.settings.polling_interval >= 1000 && parent.settings.polling_interval <= 5000) {
    var polling_interval = parent.settings.polling_interval;
} else {
  var polling_interval = 3000; // default
}

基本上,如果它未定义或超出范围,我想使用默认值。

我可以只依赖一个条件语句,例如:

if (parent.settings.polling_interval) { ... }

还是我需要检查它是否未定义,像这样?

if (typeof parent.settings.polling_interval !== 'undefined') { ... }

有没有更健壮和/或更简洁的东西?感谢您的任何建议。

4

3 回答 3

4

这是错误的:

parent.settings.account ? var account = parent.settings.account : error();

你的意思是:

var account = parent.settings.account ? parent.settings.account : error();

甚至:

var account = parent.settings.account || error();
于 2009-11-12T05:13:46.747 回答
1
var account = parent.settings.account;
if (!account)
    error();

if ((p = parent.settings.polling_interval) && p >= 1000 && p <= 5000) {
   ...
}

var polling_interval = (p = parent.settings.polling_interval) && p >= 1000 && p <= 5000 ? p : 3000;
于 2009-11-12T05:18:33.293 回答
1

[1]

parent.settings.account ? ( var account = parent.settings.account ) : error();

这将引发 SyntaxError,因为您不能以这种方式定义变量。

如果error()引发异常/引发错误,那么您可以执行以下操作:

    if ( !parent.settings.account ) {
        error()
    }

// continue code

如前所述,您还可以将变量分配给属性:

var account = parent.settings.account || error();

[2]

  var pollingInterval = parent.settings.polling_interval &&
 parent.settings.polling_interval >= 1000 &&
 parent.settings.polling_interval <= 5000 ?
 parent.settings.polling_interval : 3000;

[3] 你可以使用if ( parent.foo )and if foois undefined 不会抛出严格的错误,但它会等于 undefined,假设 parent 总是被定义。

如果设置已定义且 polling_interval 未定义,则情况相同。如果您确定属性已设置并且设置对象将存在,那么您可以使用

if ( parent.settings.polling_interval ) { }

这将有助于说明error()实际做了什么。

于 2009-11-12T05:30:09.380 回答