【问题标题】:Strange behaviour in Javascript function [duplicate]Javascript函数中的奇怪行为[重复]
【发布时间】:2015-10-24 15:07:01
【问题描述】:

如果我在下面的代码片段中执行测试功能:

function pointInside( r, p ) {
    var result =
        ( p.x >= r.location.x - r.size.width * 0.5 ) &&
        ( p.x <= r.location.x + r.size.width * 0.5 ) &&
        ( p.y >= r.location.y - r.size.height * 0.5 ) &&
        ( p.y <= r.location.y + r.size.height * 0.5 )
    ;
    return result;
}

function test() {
    var rect = {};
    rect["location"] = { x:6, y:5 };
    rect["size"] = { width:10, height:8 };
    var p = { x:10, y:8 };
    var inside = pointInside( rect, p );
    console.log( inside ? "inside" : "outside" );
}

然后文本“inside”被写入控制台。伟大的。现在,如果我将 pointInside 函数更改为:

function pointInside( r, p ) {
    return
        ( p.x >= r.location.x - r.size.width * 0.5 ) &&
        ( p.x <= r.location.x + r.size.width * 0.5 ) &&
        ( p.y >= r.location.y - r.size.height * 0.5 ) &&
        ( p.y <= r.location.y + r.size.height * 0.5 )
    ;
}

然后当我调用“外部”测试函数时,会被写入控制台。在进一步调查中,我发现 pointInside 函数实际上返回未定义。为什么?我看不出两个版本的 pointInside 之间有任何有意义的区别。谁能给我解释一下?

【问题讨论】:

    标签: javascript boolean expression


    【解决方案1】:

    在 javascript 中,; 是可选的(在语句末尾)...所以您的函数返回“未定义”(即 false-y)并且该函数中的其余代码被有效地忽略了...太好了是不是!!

    试试下面的

    function pointInside( r, p ) {
        return (
            ( p.x >= r.location.x - r.size.width * 0.5 ) &&
            ( p.x <= r.location.x + r.size.width * 0.5 ) &&
            ( p.y >= r.location.y - r.size.height * 0.5 ) &&
            ( p.y <= r.location.y + r.size.height * 0.5 )
        );
    }
    

    它可能永远不会被修复,这种愚蠢的行为,因为它会破坏太多(糟糕的)代码

    【讨论】:

      【解决方案2】:

      不幸的是,许多 javascript 解释器试图原谅丢失的分号。如果您有“return”,然后是行尾,许多解释器会认为您忘记了分号。因此你的“未定义”。

      【讨论】:

      • 虽然很多细节我不同意,但总体感觉是准确的:youtube.com/watch?v=D5xh0ZIEUOE
      • 这是规范的一部分,它不是“许多解释器尝试做的事情”,而是所有解释器必须做的事情。
      • 也许他们必须这样做,但通常情况下,现实和标准并不总是相交的。我目前正在使用 tiny-js,一个用于微控制器的嵌入式解释器。 return 等待分号,因此在这方面它不符合标准。不处理奇怪的规则可能不合规,但它使代码更小并且易于验证安全问题。
      猜你喜欢
      • 2013-05-05
      • 2018-09-25
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      • 2017-01-14
      • 2021-02-21
      • 1970-01-01
      相关资源
      最近更新 更多