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);}
。