请告诉我以下两个代码之间的区别。
var a = 1;
function b() {
a = 10;
return;
}
b();
console.log(a);
这会在控制台中打印10个。
而下面的代码在控制台
中打印1var a = 1;
function b() {
var a = 10;
return;
function a() {}
}
b();
console.log(a);
感谢您的帮助。
答案 0 :(得分:2)
在第一个代码中有一个全局变量'a',可以被任何函数修改,并且该更改将是永久性的。
但是在第二个代码中,有两个'a'变量。让我们称他们为ag(全球)和al(本地)。在第二个代码中,b()函数修改al(局部变量a)而不是全局变量。但是我们在控制台中打印全局变量。
这就是为什么两个代码的结果都不同。
答案 1 :(得分:0)
它是一个范围的元素。在第一个声明只声明了函数b之外,所以当你编辑一个内部函数时,你正在引用"外部"一个。
在第二个片段中,您将在函数内部重新声明var a,因此当您在b函数内编辑变量时,您引用的是最新的离开未触及的"外部"变量。
答案 2 :(得分:0)
您已在函数内的第二个代码中声明a
,因此变量a
的范围(可用性)仅持续到函数执行。
一旦我们从函数返回,则局部变量a
不再是因此外部全局a
的值被打印。
答案 3 :(得分:0)
第一个示例很简单:您声明了a
函数关闭的b
变量。因此b
将a
设置为10
。
你的第二个例子故意复杂而令人困惑。您声明了一个a
变量b
关闭,但阴影变量a
变量b
。更糟糕的是,a
的函数声明也在b
的范围内。 var
胜过函数声明,因为函数声明是在var
语句之前处理的。外a
完全不受b
的影响,因此最后的console.log
会记录1。
使用各种图表更容易描述:
var a = 1; // <== The declaration `b` closes over
function b() {
var a = 10; // <== The inner `a` variable
return; // <== Returns from `b`
function a() {} // <=== Declaration that was processed immediately
// upon entering `b` (the `return` doesn't affect it
// at all), but which is then superceded by `var a`
}
b();
console.log(a); // Logs 1
答案 4 :(得分:0)
当您使用var时,其范围将是其功能的本地范围。 如果没有var,它将成为一个全局函数。