2015-08-02 2 views
11

Если я выполнить тестовую функцию в следующем фрагменте кода:Странное поведение функции 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. Кто-нибудь может мне это объяснить?

ответ

8

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

+0

Хотя я не согласен с большим количеством деталей, общее ощущение о точности: https://www.youtube.com/watch?v=D5xh0ZIEUOE –

+6

Это часть спецификации, это не то, что «многие интерпретаторы пытаются это сделать», это то, что * все * переводчики * должны делать. –

+0

Возможно, они должны, но, как это часто бывает, реальность и стандарты не всегда пересекаются. В настоящее время я использую крошечные js, встроенный интерпретатор для микроконтроллеров. Там возврат ждет точку с запятой, поэтому в этом отношении не соблюдаются стандарты. Не имея отношения к странным правилам, возможно, несовместимо, но он сохраняет код небольшим и легким для проверки на проблемы безопасности. –

10

В javascript ; не является обязательным (в конце инструкции) ... поэтому ваша функция возвращает «undefined» (который является false-y), а остальная часть кода в этой функции эффективно игнорируется ... wonderful isn Это!

попробуйте следующее

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

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

Смежные вопросы