javascript变量提升和闭包理解

请参考以下攻略:

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日

相关文章

  • JavaScript中?. 和??分别是什么详解

    让我来详细讲解JavaScript中?.和??的使用。 ?.运算符 ?.运算符是ES2020(也称为ES11)中的新功能,它是用于简化可选链式调用的一种语法糖。可选链式调用允许我们选择性地访问一个对象的属性,它避免了访问未定义的对象属性时出现的TypeError错误。 示例1: const user = { name: ‘Tom’, age: 25, add…

    JavaScript 2023年5月18日
    00
  • javascript 选择文件夹对话框(web)

    当我们需要让用户选择文件夹时,可以使用 JavaScript 提供的 webkitdirectory 属性,以展示一个选择文件夹的对话框。下面是具体的步骤: HTML 首先,在 HTML 中添加按钮或其他操作元素,以触发选择文件夹的对话框。 <button onclick="openFolder()">选择文件夹</bu…

    JavaScript 2023年5月27日
    00
  • 在javascript中随机数 math random如何生成指定范围数值的随机数

    首先需要了解 Math.random() 方法可以生成一个在0(包含0)到1(不包括1)之间的一个伪随机数。要生成指定范围内的随机数,需要通过一些计算和转换来实现。以下是一些可能的做法: 做法一:生成任意两数之间的随机数 可以先生成一个在0到1之间的随机小数,然后将其乘以两个数的范围,再加上较小的数,从而实现生成任意两数之间的随机数。 function ra…

    JavaScript 2023年6月10日
    00
  • 原生JS+HTML5实现的可调节写字板功能示例

    下面是我对于“原生JS + HTML5 实现的可调节写字板功能示例”的攻略详解,包括过程和示例说明: 1. 准备工作 首先,我们需要明确一下目标:实现一个可调节写字板的功能。为此,我们需要对写字板功能的实现进行详细的分析,并列出需要用到的相关技术和工具。 1.1 写字板需求分析 写字板的基本要求是:用户可以在一个空白画布上自由绘画,还可以设置画笔的颜色及粗细…

    JavaScript 2023年5月28日
    00
  • 使用vue-cli3+typescript的项目模板创建工程的教程

    下面是使用vue-cli3+typescript的项目模板创建工程的攻略。 准备工作:- 确保已正确安装node.js和npm- 通过npm安装vue-cli3:npm i -g @vue/cli 步骤1:创建一个新项目- 打开终端窗口,输入以下命令创建一个新的vue项目: vue create my-project 在选择项目类型时,选择 Manually…

    JavaScript 2023年6月10日
    00
  • javascript表单是否为空验证方法

    当我们在网站开发中使用表单时,需要对用户输入进行验证,以确保数据的完整性和合法性。下面,我将为大家介绍一种实现JavaScript表单是否为空验证方法的攻略。 1. HTML表单 首先,我们需要在HTML文件中创建一个表单: <form> <label for="username">用户名:</label&g…

    JavaScript 2023年6月10日
    00
  • JavaScript解析JSON

    JavaScript解析JSON的步骤: 将JSON字符串转换为对象 通过对象属性访问JSON数据 组合JSON数据 以下是JavaScript解析JSON的完整攻略: 1. 将JSON字符串转换为对象 JavaScript中有一个JSON对象,它有两个方法:JSON.parse() 和 JSON.stringify()。其中,JSON.parse()用于将…

    Web开发基础 2023年3月30日
    00
  • 关于JavaScript中string 的replace

    下面是关于JavaScript中string的replace的详细攻略。 什么是replace replace() 方法是 JavaScript 中的字符串方法,它用于在字符串中查找一个指定的子串,并用另一个字符串替换它。这个替换过程是不影响原字符串,而是产生一个新的字符串。 replace() 方法接收两个参数:第一个是需要查找的子串或正则表达式,第二个是…

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