Javascript 声明变量的差异
请让我知道下面两个代码之间的区别Javascript 声明变量的差异,javascript,Javascript,请让我知道下面两个代码之间的区别 var a = 1; function b() { a = 10; return; } b(); console.log(a); 这在控制台中打印10 而下面的代码在控制台中打印1 var a = 1; function b() { var a = 10; return; function a() {} } b(); console.log(a); 谢谢你的帮助。这是一个范围的问题。在第一个函数中,a仅在函数b
var a = 1;
function b() {
a = 10;
return;
}
b();
console.log(a);
这在控制台中打印10
而下面的代码在控制台中打印1
var a = 1;
function b() {
var a = 10;
return;
function a() {}
}
b();
console.log(a);
谢谢你的帮助。这是一个范围的问题。在第一个函数中,a仅在函数b之外声明,因此当您编辑函数b内部的a时,您引用的是外部a 在第二个代码段中,您在函数内重新声明了变量a,因此,当您在b函数内编辑变量时,您引用的是最新的变量,而外部a变量未被触及。您在函数内的第二个代码中声明了a,因此变量a的作用域可用性仅持续到函数执行为止
一旦我们从函数返回,局部变量a就不再存在,因此外部全局变量a的值将被打印。第一个示例非常简单:您声明了一个a变量,b函数将其关闭。所以b将a设为10 你的第二个例子是故意的复杂和混乱。您声明了一个b关闭的a变量,但随后在b内部用a变量对其进行阴影处理。更糟糕的是,还有一个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
当您使用var时,它的作用域将是其函数的局部。
如果没有var,它将是一个全局函数。在第一个代码中,有一个全局变量“a”,可以被任何函数修改,这种更改将是永久的 但在第二个代码中,有两个“a”变量。让我们称之为ag全球和al本地。在第二个代码b中,函数正在修改所有局部变量a,而不是全局变量。但我们正在控制台中打印全局变量
这就是为什么两个代码中的结果都不同。的可能重复在第一个示例中,您在具有全局作用域的函数b中使用已声明的a,而在第二个示例中,您在函数b中重新声明a,该函数仅限于b的作用域。