gpt4 book ai didi

javascript - LET 与 VAR 以及从 block 范围提升到全局范围

转载 作者:行者123 更新时间:2023-11-28 16:43:57 25 4
gpt4 key购买 nike

根据问题:

Understanding let vs. var hoisting

Are variables declared with let or const not hoisted in ES6?

我不明白当提升将变量从 block 作用域提升到全局作用域时会发生什么。

在我的代码中,我有:

<script>

"use strict";

let PageInit = null;

document.addEventListener("DOMContentLoaded", () => {

PageInit = new IPageInit();

doSomething();

});

function doSomething() {
alert(PageInit.RefreshCounter); // 60 //correct
}

</script>

PageInit doSomething() 可以看到在全局范围内创建的内容.

但是,如果我这样做:

<script>

"use strict";

document.addEventListener("DOMContentLoaded", () => {

var PageInit = new IPageInit();

doSomething();

});

function doSomething() {
alert(PageInit.RefreshCounter); // referenceError
}

</script>

我没有正确理解提升。我预计var PageInit block 作用域内将被提升到全局作用域,这是 <script> 内的第一件事。标签。

但事实并非如此。

谁能解释一下为什么不可以吗?或者它被吊到哪里?

最佳答案

document.addEventListener("DOMContentLoaded", () => {

var PageInit = new IPageInit();

doSomething();

});

var 具有函数作用域。这意味着无论您在函数中的何处声明变量,它都可用于整个函数。

function fn () {
console.log(b)
var b = 10
}

fn()

/* this is same as writing
function fn () {
var b ======================> hoisted
console.log(b)
b = 10
}
*/

这并不意味着函数内部声明的变量在函数外部也可用。这就是为什么 doSomething 函数中的 PageInit 给出引用错误。您必须在函数外部初始化变量才能避免出现此错误

关于javascript - LET 与 VAR 以及从 block 范围提升到全局范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60779584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com