如果属性值不是赋值语句的一部分,JavaScript 会计算属性值吗?

发布于 2024-09-04 13:35:03 字数 784 浏览 5 评论 0原文

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

在 Dave Hyatt 6 月 27 日的评论中,他建议只需检查 document.body.offsetLeft 属性即可强制 Safari 进行重排。

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

document.body.offsetLeft;

还是需要将其分配给变量,例如:

var force_layout = document.body.offsetLeft;

以便浏览器计算该值?

我认为这归结为一个更基本的问题 - 即,如果不成为赋值语句的一部分,JavaScript 是否仍会评估属性的值?这是否取决于特定浏览器的 JavaScript 引擎是否优化代码?

I've come across a fairly obscure problem having to do with measuring a document's height before the styling has been applied by the browser. More information here:

In Dave Hyatt's comment from June 27, he advises simply checking the document.body.offsetLeft property to force Safari to do a reflow.

Can I simply use the following statement:

document.body.offsetLeft;

or do I need to assign it to a variable, e.g.:

var force_layout = document.body.offsetLeft;

in order for browsers to calculate that value?

I think this comes down to a more fundamental question - that is, without being part of an assignment statement, will JavaScript still evaluate a property's value? Does this depend on whether a particular browser's JavaScript engine optimizes the code?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

四叶草在未来唯美盛开 2024-09-11 13:35:03

该声明仍将被评估。

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

在上面的语句中,您可以看到 document 是一个 标识符引用,这是一个主要表达式

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

您没有执行AssignmentExpression,但该语句将被评估,因为标识符引用已解析,并且属性已查找。

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

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

举例说明:

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

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

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

obj.prop; // alerts "getter"

The statement will still be evaluated.

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

In the above statement, you can see that document is a Identifier Reference, which is a Primary Expression.

Then the property accessor operator is used (.) too lookup the body property and then the offsetLeft property.

You are not doing an AssignmentExpression but the statement will be evaluated because the Identifier Reference is resolved, and the properties are looked up.

Also, host objects, can implement accessor properties that can have a logic get and set methods, not just simple value properties.

In ECMAScript 3, we didn't had the power of creating accessor properties, only the host objects could implement them, but the 5th Edition of the standard allows us to do it.

For example to illustrate:

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

Note: The above illustrative example works on IE9 Pre, Firefox 3.7alpha, Chrome 5, and WebKit nightly builds.

Then a simple expression as your example, makes the getter to invoke:

obj.prop; // alerts "getter"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文