Подтвердить что ты не робот

Странное поведение в функции Javascript

Если я выполняю тестовую функцию в следующем фрагменте кода:

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

тогда текст "внутри" будет записан на консоль. Отлично. Теперь, если я изменил функцию 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 фактически возвращает undefined. Зачем? Я не вижу сколько-нибудь значимой разницы между двумя версиями pointInside. Может кто-нибудь объяснить это мне?

4b9b3361

Ответ 1

К сожалению, многие интерпретаторы javascript пытаются простить отсутствующие точки с запятой. Если у вас есть "возвращение", а затем конец строки, многие переводчики предполагают, что вы забыли точку с запятой. Следовательно, ваш "undefined".

Ответ 2

В javascript ; не является обязательным (в конце инструкции)... поэтому ваша функция возвращает "undefined" (который является 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 )
    );
}

это то, что, вероятно, никогда не будет исправлено, это глупое поведение, потому что он сломает слишком много (плохой) код