Javascript 什么';赋值表达式的标准格式是什么?
我在JavaScript中有以下函数,当通过JSLint运行它时,它对我大喊大叫,正如我所说的Javascript 什么';赋值表达式的标准格式是什么?,javascript,standards,jslint,Javascript,Standards,Jslint,我在JavaScript中有以下函数,当通过JSLint运行它时,它对我大喊大叫,正如我所说的 function getPos(event, element) { var x = event.clientX, y = event.clientY, currentElement = element; do { x -= currentElement.offsetLeft - currentElement.scrollLeft;
function getPos(event, element) {
var x = event.clientX,
y = event.clientY,
currentElement = element;
do {
x -= currentElement.offsetLeft - currentElement.scrollLeft;
y -= currentElement.offsetTop - currentElement.scrollTop;
} while ((currentElement = currentElement.offsetParent));
return {
x: x,
y: y
};
}
特别是关于while循环中的内联赋值表达式。我认为双括号是表示“我希望赋值表达式返回的值被类型转换为条件的布尔值”的标准方式。即使我启用了“赋值表达式”,JSLint似乎也不同意。然后我尝试添加代码>在前面,JSLint抱怨它“混淆了用法”。所以我的问题是,格式化这个的正确方法是什么
EDIT:我所说的“this”是指内联赋值表达式。我的问题的目的是要澄清,如果一个人真的想使用这一行,那么该行的可接受标准是什么,尽管我确实同意Fourtheye的答案是编写函数的最正确方式,但它并不是我所问问题的答案。根据,for JSHint,ESHint和JSLint(从2013年7月之前)您可以将其强制为以下条件:
do {
// ...
} while ((currentElement = currentElement.offsetParent) !== null);
对于较新版本的JSLint,您运气不好,如果您重视全绿色,则需要将赋值分离出来。最好不要在条件表达式中包含赋值表达式。但是,我相信while
比do…while
更适合这种情况。您可以将代码转换为这种情况
function getPos(event, element) {
var x = event.clientX,
y = event.clientY,
currentElement = element;
while (currentElement) {
x -= currentElement.offsetLeft - currentElement.scrollLeft;
y -= currentElement.offsetTop - currentElement.scrollTop;
currentElement = element.offsetParent;
}
return {
x: x,
y: y
};
}
现在,条件表达式中没有赋值,我相信这看起来很干净。如果是那样的话,它不是未定义的而不是空的,那么?@PatrickRoberts根据条件表达式,它可能是空的
,当然假设它是HTMLElement
。谢谢,我没听清楚。回答得好。尽管如此,也有可能未定义offsetParent
本身,在这种情况下,您需要首先测试:)它将被定义,应用程序本身假定为兼容HTML5的浏览器。这是一个很好的建议。我喜欢您建议通过更改控制流使代码更干净的方式。但是,如果我要吹毛求疵,这并不能真正回答问题,因为我要求内联赋值表达式的正确格式。@PatrickRoberts我理解你的问题,这就是为什么我从一个建议开始:)个人,我不会用赋值表达式代替条件表达式。为什么还要用currentElement呢?为什么不:while(element){…;element=element.offsetParent}
。我没有看到元素被用于任何其他用途,也没有在进入循环之前对其进行修改。@RobG如果我正在迭代集合,我习惯将循环变量命名为current…
。OP有类似的结构,所以我不想改变它。@RobG我不知道这是否是这样做的正当理由,但我个人认为编辑函数参数是一个坏习惯,当然,除非是一个就地函数。不久前有一个版本的Opera在执行赋值时需要双括号作为条件,否则它会将赋值“更正”为==
@RobG ehh,我打赌开发人员一定很喜欢调试这个~