JavaScript:函数对象属性未赋值可访问?是否存在提升?
先直接给你结论:JavaScript里根本没有对象属性的提升机制,你误解了这段代码的运行逻辑~
我们来一步步拆解这段代码的执行过程:
第一次调用
checkReading()时:
这时候checkReading.read这个属性还完全没被创建过,当你访问一个对象不存在的属性时,JS会返回undefined。而在if判断里,undefined属于「假值」,所以if(checkReading.read)的条件不成立,代码会跳过return,继续往下执行。接下来代码才会执行
checkReading.read = this.scrollHeight - this.scrollTop === this.clientHeight;:
这一步才正式给checkReading这个函数对象添加了read属性,赋值结果是一个布尔值——用来判断调用该函数的元素是否已经滚动到底部。之后的逻辑就顺理成章了:
根据checkReading.read的状态,禁用/启用对应的按钮,同时更新提示文本的内容。第二次及之后调用函数时:
checkReading.read已经存在了,如果它的值是true(用户已经滚到底部),if条件就会成立,函数直接return,避免重复执行后续的状态更新逻辑。
再补充澄清你提到的「提升」:只有函数声明(比如function foo() {})和用var声明的变量才有提升行为,对象的属性(哪怕是函数对象的属性)是不存在提升的。你第一次访问checkReading.read时,只是拿到了undefined而已,并不是属性被提升到了函数顶部。
内容的提问来源于stack exchange,提问作者Magnus

