在val内部设置变量

11

这似乎是有效的,但我是否有必要这样做?这样可以为我节省一行代码,并让我设置一个变量并设置文本区域的值。

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

这等同于:

default_price = 2.9;
$('#price').val(default_price);
3个回答

18

它将执行一项任务的代码嵌入到完全不同的任务代码中。

特别是在处理默认值、"常量"等内容时,混淆初始化和UI交互会导致混淆。将它们分开-更容易查找和维护。

从技术上讲,它是相同的。但从认知上讲,它并不相同。

o.v.提出了全局命名空间污染的问题。通过在任意位置声明变量,您增加了覆盖值、误打标识符、重复工作等错误的概率。

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


7
我也支持使用两行代码。不要将编写简单(一行代码)和易于理解或维护混淆。理解他人在你的代码上工作的内容很重要。保持代码易于维护对每个人都更好。 - Gilbert
我不知怎么地养成了 RTL(从右至左)编写代码的习惯,特别是在向同事解释某些东西时 - 我更关心全局作用域污染等问题。 - Oleg
@o.v. 是的,这是一个非常重要的问题。 - Dave Newton

9
我觉得在某些情况下这样的结构可能是可以接受的,但是在这种情况下不行,尤其是因为给定的例子中还存在其他的样式问题(其中最大的问题是“魔数从哪里来”)。
我认为最重要的问题是变量是否已经被声明 - 你不能简单地...
$('#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);

有时候会出现一个复杂的情况,即变量设置器被覆盖以返回与分配值不同的内容,这在我看来有点可疑。


3

我不会像你这样使用它 - 因为我总是更喜欢将对象存储为一个集合来存储单个值,例如:

var defaults = {
  "price" : 2.9
};

这是因为它更具可导出性和可移植性,在使用JavaScript时,一旦创建变量,就无法正确删除它 - 而您可以从对象中删除任意数量的键。但是,在 if 语句中,我确实经常使用您正在执行的操作。有很多程序员会抱怨,但对我来说,将某个内容的结果分配给一个变量 - 然后测试其是否存在,并在同一个 if 块内使用 - 是有意义的。在我看来,这样会使代码更易读,因为所有东西都位于同一个区域:
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
}

顺便提一下 - 以防有人想知道 - 我在上面不是无缘无故地加入了额外的括号。相当多的JavaScript编译器 (还有ActionScript编译器) 在if语句中只有一个'='会抱怨/记录错误。这是因为它们试图帮助您,以防您的意思是'=='...通过将赋值语句放在括号中,通常可以规避此检查,或者至少停止发出警告。


+1,很有趣,但是:我几乎肯定会采取不同的方法,并将行为直接与视图和/或加载机制相关联(或者根据上下文选择其他方式)。像这样的if / else语句通常会在我的脑海中引起警报,表明我可能做错了什么,而且我可以以更具沟通性的方式封装行为。 - Dave Newton
你在最后一段中所说的“JavaScript编译器”是什么意思?你是在谈论IDE或其他开发工具吗?(考虑到 JS 不会被编译部署,而浏览器也不应该对该结构提出异议。) - nnnnnn
@nnnnnn 抱歉,JavaScript 是一种解释性语言(我在打字时有一定的不确定性)...但是,许多当前的浏览器都会执行所谓的“JIT”或即时编译。无论尝试运行代码的是什么,都会触发警告和错误(只需在任何浏览器中检查控制台即可)。基本上,我扩展了我的答案,以确保在任何 EMCAScript 语言中都是安全的,并且为了防止那些反对括号的人 ;) - Pebbl
@DaveNewton - 谢谢,是的,我知道对于许多人来说这是“警钟”,但我在12年的开发工作中发现,只要其他程序员理解你可以在if语句中进行赋值(并且这不是一个错误)- 这实际上可以帮助人们理解有明确的选择加载相关数据,并且他们可以立即看到视图被分配的位置。与view = functionCall(); if(!view){view = getViewAnotherWay();}; if(view){ doSomethingWith(view);}这样的布局相比,我更喜欢这种布局,特别是当您根据视图对象的来源而不同地处理视图对象时。 - Pebbl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接