Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Strange behaviour in Javascript function [duplicate]

If I execute the test function in the following code fragment:

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

then the text "inside" gets written to the console. Great. Now, if I change the pointInside function to this:

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

then when I call the test function "outside" gets written to the console. On further investigation I find that the pointInside function is actually returning undefined. Why? I can't see any meaningful difference between the two versions of pointInside. Can anyone explain this to me?

like image 242
R Ellingworth Avatar asked Aug 02 '15 11:08

R Ellingworth


2 Answers

In javascript, ; is optional (at end of statement) ... so your function returns 'undefined' (which is false-y) and the rest of the code in that function is effectively ignored ... wonderful isn't it!!

try the following

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

it's something that will probably never be fixed, this stupid behaviour, because it would break too much (poor) code

like image 137
Jaromanda X Avatar answered Oct 14 '22 03:10

Jaromanda X


Unfortunately many javascript interpreters try to be forgiving about missing semicolons. If you have "return" and then an end of line, many interpreters will assume that you have forgotten a semicolon. Hence your "undefined".

like image 35
Max Murphy Avatar answered Oct 14 '22 04:10

Max Murphy