JavaScript 意外的变量作用域行为

标签 javascript global-variables scope

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

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

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”。为什么变量显示为“未定义”?

最佳答案

在第一种情况下,您没有创建任何局部变量,而是访问了从全局范围定义的 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 .

关于JavaScript 意外的变量作用域行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22664669/

相关文章:

c++ - C++ 中的存储分配语句

c - 如何在C中使用线程和数组

javascript - 函数内部的 setTimeout 调用函数 - Scope-Issue

java - 关于请求对象行为的混淆

matlab - "relative global"matlab或其他语言的变量

javascript - 拉力赛应用SDK 2.0 : Filtering a store of Users by UserPermissions

JavaScript if (x==y==z) :

javascript - 使用 Javascript Graph API 在 Facebook 上发布等距柱状 360° 全景图

调用者上下文中的 Javascript 调用方法

javascript - 基于网格高度的颜色 Three.js