代码之家  ›  专栏  ›  技术社区  ›  Magnus

javascript:属性函数是否被提升?

  •  1
  • Magnus  · 技术社区  · 6 年前

    我试图理解以下代码的工作原理:

    function checkReading () {
      if (checkReading.read) {
        return; 
      }
      checkReading.read = this.scrollHeight - this.scrollTop === this.clientHeight;
      document.registration.accept.disabled = document.getElementById("nextstep").disabled = !checkReading.read;
      checkReading.noticeBox.innerHTML = checkReading.read ? "Thank you." : "Please, scroll and read the following text.";
    }
    

    资料来源: https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight

    我正在努力的是 if(checkReading.read) 可以在 checkReading.read 属性声明在 checkReading 函数对象。

    函数声明(即使直接作为属性(如上所述)执行)被提升到其作用域的顶部,这是否有效?

    所以,在JS引擎完成其事件循环的第一个勾选之后, 检查阅读.read 实际上是被提升(移动)到 支票阅读 功能?

    ps:我知道普通函数声明是挂起的 function foo() {..} 但不确定是否也适用于上述属性。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Felix Kling    6 年前

    我正在挣扎的是 if(checkReading.read) 可以在 checkReading.read 属性在上声明 checkReading 函数对象。

    这与功能或起重无关。您可以访问任何对象上不存在的属性:

    var foo = {};
    console.log(foo.bar);

    如果该属性不存在,则其返回值为 undefined ,这迫使 false

    我真的想到了这个不成熟的概念,但是下面的代码永远也达不到。还是我遗漏了什么?

    如果条件是 的主体 if 语句是 执行,即 return; 不执行,因此执行函数的其余部分。

        2
  •  2
  •   Platinum Azure    6 年前

    问题不在于提升,而在于在这些不同的情况下访问未初始化的值时会发生什么。

    如果在读取变量之前从未声明该变量,则会出现referenceerror:

    if (a) { foo(); }  // ReferenceError thrown
    let a;
    

    …除非是 var function 在这种情况下,吊装适用:

    function home() {
        if (a || b()) { foo(); }
        var a;
        function b() {}
    }
    

    但是,对象属性访问是不同的。对象属性访问永远不会抛出referenceerror。对象属性也不能声明,实际上--它们只是作为对象的一部分被创建/修改/使用。

    if (!a.foo) { a.foo = new Foo(); }
    // Use a.foo