JavaScript 变量是未定义的

javascript variable is undefined

本文关键字:未定义 变量 JavaScript      更新时间:2023-09-26

首先,让我们看看代码。

var a=0;
b=1;
document.write(a);
function run(){
    document.write(b);
    var b=1;
}
run();

我认为结果是01,但实际上,结果是0undefined

然后我修改此代码。

var a=0;
b=1;
document.write(a);
function run(){
    document.write(this.b); //or document.write(window.b)
    var b=1;
}
run();

是的,这次它按预期运行。 01 .我不明白,为什么?

更有趣的是,我再次修改代码.

var a=0;
b=1;
document.write(a);
function run(){
    document.write(b);
    //var b=1;       //I comment this line
}
run();

结果为 01。

那么,谁能解释一下呢?

感谢您分享您的观点。我简化了这段代码

b=1;
function run(){
    console.log(b); //1
}

二:

b=1;
function run(){
    var b=2;
    console.log(b); //2
}

三:

b=1;
function run(){
    console.log(b); //undefined
    var b=2;
}

当你引用函数中的变量时,JS首先检查该变量是否在当前范围内声明,即在该函数内。如果未找到,它将在包含范围内查找。如果仍然没有找到,它会在下一个作用域中向上查找,依此类推,直到最终到达全局作用域。(请记住,您可以将函数嵌套在彼此内部,因此这就是您获得多个级别的包含范围的方式,尽管您的示例当然不会这样做。

声明:

b=1;

没有var声明一个可以在任何函数中访问的全局变量,除了在你的第一个函数中你还声明了一个局部b。这称为变量阴影。

"

但是",你说,"我在document.write(b)之后宣布当地b"。在这里,您遇到了声明"提升"。在函数中任意位置声明的变量被 JS 解释器视为在函数顶部声明(即,它被"提升"到顶部),但是,任何值赋值都会发生。所以你的第一个函数实际上是像这样执行的:

function run(){
    var b;              // defaults to undefined
    document.write(b);  // write value of local b
    b=1;                // set value of local b
}

在第二个函数中使用this.b时,你会发现this指的是window,而全局变量本质上是window的属性。因此,您正在访问全局b而忽略本地。

在第三个函数中,您根本不声明本地b,因此它引用全局函数。

当你编写b = 1时,你正在全局对象中创建一个属性。
在普通函数中,b将引用此全局函数。

由于您的函数包含 var b; ,函数内的b是指局部变量。 (var语句在整个函数中创建局部变量,无论var在哪里)。
但是,var语句(b = 1)的可执行部分只在那个时候执行。

var指令在

预执行阶段处理,bdocument.write(b);之前成为局部变量,所以此时bundefined

注意:为变量赋值是在执行时,因此您可以像下面这样想象您的代码。

function run(){
    document.write(b);
    var b=1;
}

与以下相同:

function run(){
    var b;
    document.write(b);
    b=1;
}

添加:

这就是为什么将每个 var 定义放在函数的顶部是一种很好的做法。

这段代码对我来说很好用

  if(var_name === "undefined"){
     alert(var_name+' : undefined');
   }