Будет ли JavaScript оценивать значение свойства, если оно не является частью оператора присваивания? - PullRequest
1 голос
/ 09 июня 2010

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

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

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

document.body.offsetLeft;

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

var force_layout = document.body.offsetLeft;

чтобы браузеры могли рассчитать это значение?

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

1 Ответ

2 голосов
/ 09 июня 2010

Оператор все еще будет оцениваться.

     Property Accessors
            |    |
            v    v
    document.body.offsetLeft;
      ^
      |- Identifier Reference

В приведенном выше утверждении вы можете видеть, что document является идентификатором Reference , который является Первичным выражением.

Затем используется оператор доступа к свойству (.), также ищите свойство 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"
...