gpt4 book ai didi

javascript - JavaScript 中未初始化变量的作用域

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:52:36 24 4
gpt4 key购买 nike

我不明白为什么这段代码的行为是这样的:

for (var i = 1; i < 3; i++) {
var j;
if (!j) {
j = 1;
} else {
alert("why are we here? j shouldn't be defined but it's " + j);
}
}

( jsFiddle )

如果我将 j 设置为 null 并检查 null,它会按我认为应该的方式工作。

这不是 Java、C#、C++ 等的工作方式,因此会造成混淆。

最佳答案

这是因为 JavaScript 中的变量作用域为函数(如果不在函数内,则为全局作用域)。 var 不在循环内,花括号不定义新的闭包。基本上,j 的值在循环体之后仍然存在,并且 var 不会将 j 重新定义为 undefined。这就是显式设置 var j = null; 具有预期效果的原因。

示例 1:

考虑这一点的一个好方法是,任何时候你用 var 声明一个变量,就像这样。

function someFunc() {
for(var i = 0; i < 3; i++){
var j;
}
}

解释器像这样提升变量声明。

function someFunc() {
var i;
var j;
for(i = 0; i < 3; i++){
}
}

请注意,由于 var j 声明被提升到函数的顶部,因此该声明实际上在循环内不执行任何操作。

例子2:

但是,如果您要像这样用 null 初始化变量。

function someFunc() {
for(var i = 0; i < 3; i++){
var j = null;
}
}

会这样解释。

function someFunc() {
var i;
var j;
for(i = 0; i < 3; i++){
j = null;
}
}

注意对于每个循环,j 是如何设置为 null 的。

ES6 let 关键字:

ES6 中有一个关键字会像这样在循环中创建一个作用域,它是let。关键词。请记住,目前浏览器对 let 关键字的支持很差。

for (var i = 1; i < 3; i++) {
let j;
if (!j) {
j = 1;
} else {
alert("why are we here? j shouldn't be defined but it's "+ j);
}
}

关于javascript - JavaScript 中未初始化变量的作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27737236/

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