1

在浏览器应用样式之前,我遇到了一个与测量文档高度有关的相当模糊的问题。更多信息在这里:

在 Dave Hyatt 6 月 27 日的评论中,他建议简单地检查该document.body.offsetLeft属性以强制 Safari 进行回流。

我可以简单地使用以下语句:

document.body.offsetLeft;

还是我需要将它分配给一个变量,例如:

var force_layout = document.body.offsetLeft;

为了让浏览器计算该值?

我认为这归结为一个更基本的问题——也就是说,在不作为赋值语句的一部分的情况下,JavaScript 是否仍会评估属性的值?这是否取决于特定浏览器的 JavaScript 引擎是否优化了代码?

4

1 回答 1

2

该语句仍将被评估。

     属性访问器
            | |
            vv
    document.body.offsetLeft;
      ^
      |- 标识符参考

在上面的语句中,你可以看到它document是一个Identifier Reference,它是一个Primary Expression

然后使用属性访问器运算符 ( .) 来查找body属性,然后查找offsetLeft属性。

您没有执行 anAssignmentExpression但该语句将被评估,因为 Identifier Reference 已解析,并且已查找属性。

此外,宿主对象可以实现具有逻辑和方法的访问器属性,而不仅仅是简单的值属性getset

在 ECMAScript 3 中,我们没有创建访问器属性的能力,只有宿主对象可以实现它们,但标准的第 5 版允许我们这样做。

例如说明:

var obj = {};
Object.defineProperty(obj, 'prop', { // ECMAScript 5 method
  get: function () {
    alert('getter');
  }
});

注意:上面的示例适用于 IE9 Pre、Firefox 3.7alpha、Chrome 5 和 WebKit nightly build。

然后一个简单的表达式作为您的示例,使 getter 调用:

obj.prop; // alerts "getter"
于 2010-06-09T18:54:43.593 回答