JavaScript 变量和函数提升详解:alert(a); a(); var a = 3; function a() { ... }
在 JavaScript 中,变量和函数声明会被提升到作用域的顶部,但是变量的赋值不会被提升。这会导致一些令人困惑的行为,例如:
alert(a); // undefined
a(); // TypeError: a is not a function
var a = 3;
function a() {
alert(10);
};
alert(a); // 3
a = 6;
a(); // TypeError: a is not a function
执行过程解释:
-
第一行代码:
alert(a);- 在 JavaScript 中,变量声明会被提升,所以
var a会被提升到代码块的顶部。 - 然而,变量的赋值
a = 3不会被提升。 - 因此,在
alert(a)执行时,a已经被声明,但尚未被赋值,所以它的值为undefined。
- 在 JavaScript 中,变量声明会被提升,所以
-
第二行代码:
a();- 在这行代码执行时,
a仍然是undefined,因为它只被声明了,没有被赋值为函数。 - 尝试调用
a()会导致TypeError: a is not a function错误,因为a并不是一个函数。
- 在这行代码执行时,
-
第三行代码:
var a = 3;- 此时,
a被赋值为3。
- 此时,
-
第四行代码:
function a() { ... };- 函数声明会被提升,但是由于
a已经被赋值为3,所以这个函数声明不会覆盖变量a的值。 - 也就是说,
a仍然是一个变量,而不是一个函数。
- 函数声明会被提升,但是由于
-
第六行代码:
a = 6;a被重新赋值为6。
-
第七行代码:
a();- 由于
a仍然是一个变量,而不是一个函数,所以再次尝试调用a()会导致TypeError: a is not a function错误。
- 由于
总结:
- JavaScript 中变量和函数声明会被提升到作用域的顶部,但是变量的赋值不会被提升。
- 变量提升会导致在变量被赋值之前访问变量,得到
undefined的结果。 - 函数提升不会覆盖已经被赋值的变量,即使函数名和变量名相同。
理解变量和函数提升机制对于编写正确可靠的 JavaScript 代码至关重要。为了避免潜在的错误,建议在代码块的顶部声明所有变量和函数,并及时赋值,避免在未赋值的情况下使用它们。
原文地址: https://www.cveoy.top/t/topic/qi9g 著作权归作者所有。请勿转载和采集!