javascript变量提升和闭包理解

yizhihongxing

请参考以下攻略:

JavaScript变量提升

什么是变量提升?

变量提升是 Javascript 中的一种特性,它指的是在代码执行前,所有的变量声明都会被提升到代码的开头部分,但是赋值操作并不会被提升。也就是说,变量声明后的变量名可以在声明之前被使用,但是变量值会返回 undefined。

示例一:

console.log(a); // Output: undefined
var a = 5;

变量 a 的声明被提升到代码的顶部,但是赋值操作并没有被提升。所以,输出的是 undefined。

示例二:

console.log(sum(4, 6)); // Output: 10
function sum(a, b) {
  return a + b;
}

函数声明也可以被提升,所以函数可以在声明之前被使用。

let 和 const 的变量提升

let 和 const 的变量提升与 var 的不同。它们会将声明封装在一个称为暂存死区 (Temporal Dead Zone / TDZ) 的区域内,变量在此期间就不能被访问。

示例:

console.log(a); // Output: ReferenceError
let a = 5;

let 的变量声明没有被提升,所以访问 a 会引发 ReferenceError 错误

JavaScript闭包

什么是闭包?

闭包是 Javascript 中一个非常重要的概念,也是一个函数与其词法作用域中的变量环境的集合体。在一个函数内部,我们可以访问到本函数作用域中的变量和全局作用域中的变量。当本函数执行完后,这个作用域通常就会被销毁,但是当存在一个闭包时,这个被销毁的作用域仍旧存在,并且可以被外部环境所访问。

示例一:

function outerFunction() {
  var name = "Alice";
  function innerFunction() {
    console.log(name);
  }
  return innerFunction;
}
var myFunction = outerFunction();
myFunction();

innerFunction() 定义在 outerFunction() 的内部,也就是在一个私有的作用域内。但是让它成为了闭包,是因为它被外部函数返回,并且可以访问到它定义时的作用域中的变量。在这个例子中,innerFunction() 可以访问 name 变量,因为它定义在 outerFunction() 中。

示例二:

function add(x) {
  return function(y) {
    return x + y;
  }
}
var addFive = add(5);
console.log(addFive(4)); // Output: 9

在这个示例中,add() 函数返回了一个闭包,它通过定义一个函数返回另一个函数。这个闭包可以访问 add() 中定义的变量,因为它拥有 add() 中定义的作用域。在这个例子中,闭包可以访问 x 的值 5。在调用 addFive(4) 时,闭包会将 5 和传入的参数 4 相加,返回 9。

以上就是 JavaScript 变量提升和闭包理解的攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript变量提升和闭包理解 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • JS使用tween.js动画库实现轮播图并且有切换功能

    下面是使用tween.js实现轮播图并且有切换功能的攻略,包含两个示例说明。 1. 引入tween.js库 在HTML文档的标签中添加tween.js库的链接: <head> <script type="text/javascript" src="https://cdnjs.cloudflare.com/aja…

    JavaScript 2023年6月10日
    00
  • 《JavaScript高级程序设计》阅读笔记(二) ECMAScript中的原始类型

    《JavaScript高级程序设计》阅读笔记(二) ECMAScript中的原始类型 原始类型 ECMAScript 中有 6 种原始类型:Undefined、Null、Boolean、Number、String 和 Symbol。这些数据类型都是通过值来标识的。原始类型的值是不可更改的。 Undefined 和 Null Undefined 和 Null …

    JavaScript 2023年5月27日
    00
  • JavaScript自动内存管理与垃圾回收策略详细分析讲解

    JavaScript自动内存管理与垃圾回收策略详细分析 在JavaScript中,内存管理是自动化的,这意味着开发人员不需要手动分配或释放内存,这是由JavaScript引擎中的垃圾回收器自动完成的。了解垃圾回收策略对于JavaScript开发人员来说非常重要,因为它可以显著影响到性能和内存占用。 JavaScript中的内存管理 JavaScript中的内…

    JavaScript 2023年6月10日
    00
  • JS实现的3des+base64加密解密算法完整示例

    JS实现的3DES+Base64加密解密算法完整示例 简介 本文介绍了如何使用JavaScript实现一种加密算法——3DES+Base64,包含完整的示例代码。具体而言,我们将使用3DES算法对明文进行加密,并将加密后的结果使用Base64算法编码,以便于传输。同时,我们也将演示如何使用3DES算法进行解密,以还原出原始的明文。 算法介绍 3DES算法 3…

    JavaScript 2023年5月19日
    00
  • JS使用new操作符创建对象的方法分析

    下面是“JS使用new操作符创建对象的方法分析”的攻略: 1. 创建对象的方式 JS有多种创建对象的方式,常用的有四种: 使用对象字面量创建对象; 使用构造函数创建对象; 使用Object.create()方法创建对象; 使用class和constructor方法创建对象。 而本题讨论的是第二种方式,使用构造函数创建对象。 2. 构造函数概述 构造函数是JS…

    JavaScript 2023年5月27日
    00
  • 在js中使用”with”语句中跨frame的变量引用问题

    在JavaScript中,我们可以使用with语句来简化某些代码块的书写,从而使得代码更加简洁易读。但是,在使用with语句时需要注意,在跨frame的情况下,可能会引起变量引用的问题,尤其是在涉及到变量作用域的问题时。 下面是在JS中使用with语句中跨frame的变量引用问题的完整攻略: 问题的表现 假设在sample.html文件中,我们有一个名为fr…

    JavaScript 2023年6月10日
    00
  • javascript事件捕获机制【深入分析IE和DOM中的事件模型】

    Javascript事件捕获机制:深入分析IE和DOM中的事件模型 Javascript事件是指Web页面交互中发生的各种行为,例如用户单击、滚动、键盘输入、鼠标移动等。针对这些事件,Javascript为我们提供了事件捕获和事件冒泡两种机制。本文将深入分析IE和DOM中的事件模型,并结合示例说明它们的具体用法。 IE事件模型 以单击事件为例,在IE浏览器中…

    JavaScript 2023年6月10日
    00
  • javascript+php实现根据用户时区显示当地时间的方法

    实现根据用户时区显示当地时间的方法需要以下步骤: 获取用户的时区 使用Javascript的Date对象获取用户所在时区的偏移量。代码如下: var d = new Date(); var timezoneOffset = d.getTimezoneOffset() / 60; 其中getTimezoneOffset()方法返回的是分钟,所以需要将其转化为小…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部