Javascript函数中的奇怪行为

时间:2015-08-02 11:39:07

标签: javascript boolean expression

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

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 )
    ;
}

然后当我调用测试函数时,“outside”被写入控制台。在进一步调查中,我发现pointInside函数实际上是返回undefined。为什么?我看不出pointInside的两个版本之间有任何有意义的区别。任何人都可以向我解释这个吗?

2 个答案:

答案 0 :(得分:11)

在javascript中,;是可选的(在语句末尾)...因此您的函数会返回&#39; undefined&#39; (这是假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 )
    );
}

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

答案 1 :(得分:8)

不幸的是,许多javascript口译员试图原谅丢失的分号。如果你有“返回”然后是行尾,许多口译员都会认为你忘记了分号。因此,你的“未定义”。