赞
踩
JavaScript 中存在变量提升和函数提升,它们是由 JavaScript 解释器在代码执行之前进行的一种行为。
最新的 ECMAScript 标准定义了 8 种数据类型:
true 和 false。null 与 Null、NULL或变体完全不同。42 或者 3.14159。"Howdy"。在 JavaScript 中,使用 var 声明的变量会被提升到其所在作用域的顶部。这意味着可以在变量声明之前引用变量,而不会导致 ReferenceError。
- console.log(x); // 输出: undefined
- var x = 5;
- console.log(x); // 输出: 5
实际上,上述代码在执行时会被解释器处理成如下形式:
- var x;
- console.log(x); // 输出: undefined
- x = 5;
- console.log(x); // 输出: 5
值得注意的是,变量提升只提升声明,而不提升赋值。变量的初始化赋值仍然保留在原始位置。
在 JavaScript 中,使用 function 声明的函数会被整体提升到其所在作用域的顶部。这意味着可以在函数声明之前调用函数,而不会导致 ReferenceError。
- sayHello(); // 输出: "Hello!"
- function sayHello() {
- console.log("Hello!");
- }
实际上,上述代码在执行时会被解释器处理成如下形式:
- function sayHello() {
- console.log("Hello!");
- }
- sayHello(); // 输出: "Hello!"
与变量提升类似,函数提升也只提升声明,不提升具体的函数实现。因此,在函数声明之前调用函数是有效的。
let 和 const 声明的变量也存在提升,但它们不会被初始化为 undefined,而是保持在 "暂时性死区"(Temporal Dead Zone,TDZ)中。- console.log(x); // Uncaught ReferenceError: Cannot access 'x' before initialization
- let x = 3;
var、let、或 const 声明的函数)的提升行为与函数声明略有不同,它们会被提升,但初始化的赋值不会提升。- baz(); // Uncaught TypeError: baz is not a function
- var baz = function () {
- console.log("bar2");
- };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。