【问题标题】:JavaScript unexpected variable scope behaviorJavaScript 意外的变量范围行为
【发布时间】:2014-03-26 14:50:21
【问题描述】:

我想知道一些有关作用域行为的信息。

例如我有一个变量和一个函数:

var test = 1;
function scope(){
    alert(test);
    test=2;
}
scope();
alert(test);

这将显示 1 和 2。没问题。但如果我这样做:

var test = 1;
function scope(){
    alert(test);
    var test = 2;
}
scope();
alert(test);

这将显示“未定义”和“1”。为什么变量显示为“未定义”?

【问题讨论】:

标签: javascript global-variables scope


【解决方案1】:

在第一种情况下,您没有创建任何局部变量,而是访问了从全局范围定义的 test

var test = 1;        // Global Test - GT

function scope() {
    alert(test);     // Accesses GT
    test = 2;        // Assigns to GT
}
scope();
alert(test);         // Accesses GT

但在第二种情况下,您正在创建一个新变量,但在为其赋值之前访问它。默认情况下,所有未分配的变量都将具有undefined

在 JavaScript 中,变量的作用域是声明它们的函数。因此,当您在函数中使用 var variable_name 时,您正在创建新变量,并且函数的所有部分都可以访问它。此外,您正在创建一个与全局变量同名的变量。当 JavaScript 查找变量test 时,它会首先搜索函数的本地范围,然后就会在那里找到。因此,将使用本地 test 变量。

alert(test);     // value will be `undefined` till a value is assigned.
var test = 2;    // Declared a new variable and assigned value here

这种行为称为variable hoisting

【讨论】:

  • 但在这两种情况下,我都在函数之前分配了一个值。
  • @geopl no - 在第二种情况下,您在警报之后分配值。这就是你得到undefined的原因。
  • @geopl 现在请检查答案,我已经添加了一些解释
  • 好吧好吧。我知道如果稍后分配变量,我们有一个未定义的值,但我发现奇怪的是,在第二种情况下,它没有得到我的全局变量。
  • @geopl 在 JavaScript 中,变量的作用域是声明它们的函数。因此,当您在函数中使用 var variable_name 时,您正在创建新变量,并且函数的所有部分都可以访问它。此外,您正在创建一个与全局变量同名的变量。当 JavaScript 查找变量 test 时,它会首先搜索函数的局部作用域,然后就会在那里找到。因此,将使用本地测试变量。
【解决方案2】:

吊装:

你的第二个代码:

var test = 1;
function scope(){
    alert(test);
    var test = 2;
}
scope();
alert(test);

实际上是:

var test = 1;
function scope(){
    var test;
    alert(test);
    test = 2;
}
scope();
alert(test);

同样的问题:

var test = 1;
function scope(){
    if (typeof test =="undefined") alert(2)

    var test = 2;
}
scope();
alert(test);

【讨论】:

    猜你喜欢
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 2020-02-07
    • 2012-12-23
    相关资源
    最近更新 更多