JavaScript оценит значение свойства, если это не будет часть оператора присваивания?

Я столкнулся с довольно неясной проблемой, имеющей отношение к измерению высоты документа, прежде чем моделирование было применено браузером. Больше информации здесь:

В комментарии Dave Hyatt с 27 июня, он советует просто проверять document.body.offsetLeft свойство, чтобы вынудить Safari сделать обратное течение.

Могу я просто использовать следующее утверждение:

document.body.offsetLeft;

или сделайте я должен присвоить его переменной, например:

var force_layout = document.body.offsetLeft;

для браузеров для вычисления того значения?

Я думаю, что это сводится к более фундаментальному вопросу - то есть, не будучи частью оператора присваивания, JavaScript все еще оценит значение свойства? Это зависит от того, оптимизирует ли механизм JavaScript конкретного браузера код?

1
задан Bungle 9 June 2010 в 18:42
поделиться

1 ответ

Утверждение все равно будет оценено.

     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"
2
ответ дан 2 September 2019 в 23:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: