11

这似乎有效并且有效,但是有什么理由我不应该这样做吗?它为我节省了一行代码,让我可以设置一个变量和一个文本区域的值。

$('#price').val(default_price = 2.9);

这相当于:

default_price = 2.9;
$('#price').val(default_price);
4

3 回答 3

18

它将做一件事的代码嵌入到做完全不同的事情的代码中。

特别是如果您在谈论默认值、“常量”等,将初始化与 UI 交互混为一谈会导致混淆。将它们分开——更容易找到和维护。

从技术上讲,它是一样的。认知上不是。

ov 引发了全局命名空间污染的幽灵。通过在任意位置声明变量,您增加了覆盖值、粗手指识别标识符、重复工作等的几率。

除了创建难以隔离的错误之外,这是一个额外的认知负担,因为您必须了解声明的变量的范围,定位它可能被使用的其他地方等。

于 2012-09-09T22:26:19.930 回答
9

我会认为这样的结构在某些情况下是可以接受的,但不是这个,特别是因为在给定的示例中还有其他风格问题(最大的问题是“幻数从何而来”)

IMO 的主要关注点是变量是否已被声明——你不能简单地

$('#price').val(var default_price = 2.9); //nope

如果原始代码与尚未声明的变量一起使用,您最终会污染全局范围。但是,如果变量已经被声明,它会带来一个后续问题“为什么没有用正确的默认值声明它”。或者,根据(未知)条件,幻数可能会有所不同:

if (/*whatever*/) {
  $('#price').val(default_price = 2.9);
} else {
  $('#price').val(default_price = 9522); //over 9000
}

同样,这在风格上很糟糕,因为设置 的值#price应该在条件(或switch语句)之外执行:

if (/*whatever*/) {
  default_price = 2.9;
} else {
  default_price = 9522;
}
$('#price').val(default_price);

可能存在一个复杂的情况,其中变量设置器被覆盖以返回分配的值以外的东西,这首先是 IMO 的一个有问题的做法。

于 2012-09-09T23:14:22.437 回答
3

我不会像你那样使用它——因为我总是更喜欢对象将奇异值存储为一个集合,即:

var defaults = {
  "price" : 2.9
};

(这样做的原因是它更易于导出、更便携,并且使用 JavaScript 无法在创建变量后正确删除它 - 而您可以从对象中删除任意数量的键)

但是,我确实使用了您在if statements. 那里有很多编码人员会抱怨它,但对我来说,将某些东西的结果分配给一个 var - 然后你正在测试它是否存在 - 然后在同一个中使用if block是非常有意义的,在我看来会导致更具可读性的代码,因为所有内容都位于同一区域:

var view;

if ( (view = someClass.thatChecksAndLoads('a view')) ) {
  /// do something with the view
}

以上内容非常适合您有多种获取view对象的方式的情况,例如:

if ( (view = someClass.thatChecksAndLoads('a view')) ) {
  /// do something with the view
}
else if ( (view = anotherWay.toLoad('a view')) ) {
  /// do something here instead
}

作为旁注 - 以防万一有人想知道 - 我不只是在上面无缘无故地放入额外的括号。如果 if 语句中有一个单数“=”,相当多的 JavaScript 编译器(以及 ActionScript 编译器)会抱怨/记录错误。这一切都是因为他们试图提供帮助,以防你的意思是'=='......通过将赋值括在括号中,这通常会绕过检查,或者至少它会阻止发出警告。

于 2012-09-09T22:38:34.633 回答