Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 全局变量重写与局部变量重写_Javascript - Fatal编程技术网

Javascript 全局变量重写与局部变量重写

Javascript 全局变量重写与局部变量重写,javascript,Javascript,以下测试成功,并打印1和1: function test1() { a = 1; console.log(a); // prints "1" } function test2() { console.log(a); // prints "1" } test1(); test2(); 以下测试失败,因为局部变量覆盖了先前创建的全局变量: function test1() { a = 1; var a = 2; console.log(a); //

以下测试成功,并打印
1
1

function test1() {
    a = 1;
    console.log(a); // prints "1"
}
function test2() {
    console.log(a); // prints "1"
}
test1();
test2();
以下测试失败,因为局部变量覆盖了先前创建的全局变量:

function test1() {
    a = 1;
    var a = 2;
    console.log(a); // prints "2"
}
function test2() {
    console.log(a); // throws an error
}
test1();
test2();
为什么第二个示例永久删除全局变量?这种功能在JavaScript中有什么用途/逻辑

已编辑:适用于那些将其标记为

提升是指当一个后来声明的局部变量在函数范围内上移,覆盖了以前可见的变量时的场景。但是在我们的例子中,函数首先创建一个全局变量,然后完全/全局地删除它

但是,它可能是相关的,正如我们在以下测试中所看到的:

function test1() {
    a = 1;
    console.log(a); // prints "1"
}
function test2() {
    console.log(a); // prints "undefined"
    var a = 2;
}
function test3() {
    console.log(a); // prints "1"
}
test1();
test2();
test3();

在第二种情况下,不存在名为
a
的全局变量

a=1
通常不会创建全局变量。语句
a=1
将值
1
存储在名为
a
的变量中。如果任何包含局部作用域的变量环境具有名为
a
的变量,则具有
a
变量的最近作用域将该变量设置为
1

作为一种特殊情况,如果名为
a
的变量不存在于任何包含范围中(并且如果未处于严格模式),则JavaScript引擎将创建名为
a
的全局变量

在第二种情况下,
var a
在局部范围内创建一个
a
变量。由于提升,对作用域变量环境的修改发生在任何代码运行之前。因此,在执行
a=1
时,该局部作用域确实有一个名为
a
的变量,因此使用局部变量

在第三种情况下,
test2
记录局部变量
a
(由
var a
创建)。调用
log
时,本地
a
尚未分配值


提升是指当一个后来声明的局部变量在函数范围内上移,覆盖了以前可见的变量时的场景

提升仅仅意味着所有
var
声明都被视为发生在其包含函数的顶部。它与重写变量可见性(直接)无关


请注意,带有转让的声明将只挂起声明,而不挂起转让。赋值保持在函数中的任何位置。

Javascript将变量声明移到顶部。因此,在本例中,编译器将您的代码读取为:

function test1() {
    var a;
    a = 1;
    a = 2;
    console.log(a); // prints "2"
}
function test2() {
    console.log(a); // throws an error
}
test1();
test2();

JavaScript将变量声明提升到函数顶部。您的示例中没有全局变量。。它们都是本地变量。@YacoZaragoza,如果是这种情况,第一个示例中的test2()将失败。在第二个示例中,全局变量从未被引用。代码变为:
function test1(){var a;a=1;a=2;console.log(a);}