Если я выполнить тестовую функцию в следующем фрагменте кода:Странное поведение функции 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. Кто-нибудь может мне это объяснить?
Хотя я не согласен с большим количеством деталей, общее ощущение о точности: https://www.youtube.com/watch?v=D5xh0ZIEUOE –
Это часть спецификации, это не то, что «многие интерпретаторы пытаются это сделать», это то, что * все * переводчики * должны делать. –
Возможно, они должны, но, как это часто бывает, реальность и стандарты не всегда пересекаются. В настоящее время я использую крошечные js, встроенный интерпретатор для микроконтроллеров. Там возврат ждет точку с запятой, поэтому в этом отношении не соблюдаются стандарты. Не имея отношения к странным правилам, возможно, несовместимо, но он сохраняет код небольшим и легким для проверки на проблемы безопасности. –