在val中设置变量

时间:2012-09-09 22:24:26

标签: javascript jquery coding-style

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

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

它等同于:

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

3 个答案:

答案 0 :(得分:18)

它嵌入代码在代码中执行一项完全不同的事情。

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

技术上它是一回事。 认知它不是。

o.v。提出了全球命名空间污染的幽灵。通过在任意位置声明变量,可以增加覆盖值的几率,指责标识符,重复工作量等等。

除了创建难以隔离的错误之外,这还是一个附加认知负载,因为您必须了解声明变量的范围,找到可能使用的其他位置,等等

答案 1 :(得分: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);

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

答案 2 :(得分: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编译器)会抱怨/记录错误。所有这些都是因为他们试图提供帮助只是因为你的意思是'=='...通过将括号括在括号中这通常会绕过支票,或者至少它会停止发出警告。