Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么';赋值表达式的标准格式是什么?_Javascript_Standards_Jslint - Fatal编程技术网

Javascript 什么';赋值表达式的标准格式是什么?

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;

我在JavaScript中有以下函数,当通过JSLint运行它时,它对我大喊大叫,正如我所说的

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,我打赌开发人员一定很喜欢调试这个~