以下测试成功,并打印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中有什么用途/逻辑?
已编辑:对于将其标记为Strange Behavior on Global and Local Variable in 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();
答案 0 :(得分:2)
在第二种情况下,没有名为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
声明都被视为发生在其包含函数的顶部。它(直接)与覆盖变量可见性无关。
请注意,带有赋值的声明只会提升声明,而不是赋值。无论在函数中的哪个位置,赋值都会保留在原位。
答案 1 :(得分:1)
Javascript将变量声明移到顶部。因此,在此示例中,编译器将代码读取为:
"My New View" - // Row for Expandable ListView,which is RelativeLayout(into this Layout i got TextView).