JavaScript中的变量提升(Hoisting)将`var`声明和函数声明提前到作用域顶部,允许在声明前使用

简介: 【6月更文挑战第25天】JavaScript中的变量提升(Hoisting)将`var`声明和函数声明提前到作用域顶部,允许在声明前使用。`let`和`const`不完全提升,存在暂时性死区(TDZ),尝试在初始化前访问会出错。函数声明会被提升,但函数表达式不会。

变量提升(Hoisting)是JavaScript中的一个特性,它涉及到变量和函数声明的处理方式。在JavaScript中,所有在函数作用域内的变量和函数声明都会被提升到当前作用域的顶部。这意味着你可以在声明之前使用它们。

然而,这只是表面上的现象,实际上,JavaScript引擎并不真的将变量或函数移动到代码的顶部。而是先创建了一个变量或函数的引用,在执行阶段再给它们赋值或定义内容。

有两种类型的变量声明:varletconst。其中,只有var声明的变量会发生变量提升。letconst 声明的变量也会经历所谓的“暂时性死区”(Temporal Dead Zone, TDZ),在这个区域内,虽然变量已经声明但还没有初始化,尝试访问这些变量会导致错误。

以下是一个关于变量提升的例子:

console.log(myVar); // 输出: undefined

var myVar = 5;

console.log(myVar); // 输出: 5

在这个例子中,尽管myVar是在console.log之后声明的,但是由于变量提升,这个声明被移到了顶部。因此,第一个console.log输出的是undefined,因为在真正赋值之前,变量已经被声明了。

注意:虽然函数声明也被提升,但函数表达式不会被提升。例如:

console.log(myFunction); // 输出: undefined

// 函数声明被提升
function myFunction() {
   
    console.log('Hello');
}

// 而函数表达式不会被提升
var myOtherFunction = function() {
   
    console.log('World');
};

console.log(myOtherFunction); // 输出: function() {...}

在这个例子中,myFunction是通过函数声明创建的,所以它的声明被提升到了顶部,而myOtherFunction是通过函数表达式创建的,因此不会被提升。

相关文章
|
5天前
|
JavaScript 前端开发
js的作用域作用域链
【10月更文挑战第29天】理解JavaScript的作用域和作用域链对于正确理解变量的访问和生命周期、避免变量命名冲突以及编写高质量的JavaScript代码都具有重要意义。在实际开发中,需要合理地利用作用域和作用域链来组织代码结构,提高代码的可读性和可维护性。
|
4天前
|
自然语言处理 JavaScript 前端开发
[JS]作用域的“生产者”——词法作用域
本文介绍了JavaScript中的作用域模型与作用域,包括词法作用域和动态作用域的区别,以及全局作用域、函数作用域和块级作用域的特点。通过具体示例详细解析了变量提升、块级作用域中的暂时性死区等问题,并探讨了如何在循环中使用`var`和`let`的不同效果。最后,介绍了两种可以“欺骗”词法作用域的方法:`eval(str)`和`with(obj)`。文章结合了多位博主的总结,帮助读者更快速、便捷地掌握这些知识点。
14 2
[JS]作用域的“生产者”——词法作用域
|
6天前
|
前端开发 JavaScript 数据处理
CSS 变量的作用域和 JavaScript 变量的作用域有什么不同?
【10月更文挑战第28天】CSS变量和JavaScript变量虽然都有各自的作用域概念,但由于它们所属的语言和应用场景不同,其作用域的定义、范围、覆盖规则以及与其他语言特性的交互方式等方面都存在明显的差异。理解这些差异有助于更好地在Web开发中分别运用它们来实现预期的页面效果和功能逻辑。
|
5天前
|
JavaScript 前端开发
如何在 JavaScript 中实现块级作用域?
【10月更文挑战第29天】通过使用 `let`、`const` 关键字、立即执行函数表达式以及模块模式等方法,可以在JavaScript中有效地实现块级作用域,更好地控制变量的生命周期和访问权限,提高代码的可维护性和可读性。
|
13天前
|
JavaScript 前端开发
javascript的作用域
【10月更文挑战第19天javascript的作用域
|
18天前
|
JavaScript 前端开发
JavaScript 作用域
JavaScript 作用域是指程序中可访问的变量、对象和函数的集合。它分为函数作用域和局部作用域。函数作用域内的变量仅在函数内部可见,而全局作用域的变量在整个网页中均可访问。局部变量在函数执行完毕后会被销毁,而全局变量则在整个脚本生命周期中都存在。未使用 `var` 关键字声明的变量默认为全局变量。
|
20天前
|
存储 JavaScript 前端开发
JS函数提升 变量提升
【10月更文挑战第6天】函数提升和变量提升是 JavaScript 语言的重要特性,但它们也可能带来一些困惑和潜在的问题。通过深入理解和掌握它们的原理和表现,开发者可以更好地编写和维护 JavaScript 代码,避免因不了解这些机制而导致的错误和不一致。同时,不断提高对执行上下文等相关概念的认识,将有助于提升对 JavaScript 语言的整体理解和运用能力。
|
27天前
|
JavaScript 前端开发 安全
JS中const有没有变量提升
JS中const有没有变量提升
13 0
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
92 2
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的小区物流配送系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的小区物流配送系统附带文章源码部署视频讲解等
112 4