Я столкнулся с довольно неясной проблемой, имеющей отношение к измерению высоты документа, прежде чем моделирование было применено браузером. Больше информации здесь:
В комментарии Dave Hyatt с 27 июня, он советует просто проверять document.body.offsetLeft
свойство, чтобы вынудить Safari сделать обратное течение.
Могу я просто использовать следующее утверждение:
document.body.offsetLeft;
или сделайте я должен присвоить его переменной, например:
var force_layout = document.body.offsetLeft;
для браузеров для вычисления того значения?
Я думаю, что это сводится к более фундаментальному вопросу - то есть, не будучи частью оператора присваивания, JavaScript все еще оценит значение свойства? Это зависит от того, оптимизирует ли механизм JavaScript конкретного браузера код?
Утверждение все равно будет оценено.
Property Accessors | | v v document.body.offsetLeft; ^ |- Identifier Reference
В приведенном выше утверждении видно, что document
является Identifier Reference, который является Primary Expression.
Затем используется оператор доступа к свойствам (.
) для поиска свойства body
, а затем свойства offsetLeft
.
Вы не выполняете AssignmentExpression
, но утверждение будет оценено, поскольку ссылка на идентификатор разрешена, а свойства просмотрены.
Также, объекты-хосты, могут реализовывать аксессорные свойства, которые могут иметь логические get
и set
методы, а не только простые свойства значения.
В ECMAScript 3 у нас не было возможности создавать свойства-аксессоры, их могли реализовывать только объекты-хосты, но 5-я редакция стандарта позволяет нам это делать.
Для примера:
var obj = {};
Object.defineProperty(obj, 'prop', { // ECMAScript 5 method
get: function () {
alert('getter');
}
});
Примечание: Приведенный выше иллюстративный пример работает на IE9 Pre, Firefox 3.7alpha, Chrome 5 и ночных сборках WebKit.
Тогда простое выражение, как в вашем примере, заставляет геттер вызывать:
obj.prop; // alerts "getter"