简单谈谈javascript中的变量、作用域和内存问题

Javascript中的变量、作用域和内存问题

变量的声明和数据类型

在Javascript中,我们可以使用varletconst关键字声明一个变量。其中,var声明的变量具有函数作用域,而letconst声明的变量则具有块级作用域。

Javascript中的数据类型包括基本数据类型和引用数据类型。基本数据类型有NumberStringBooleannullundefinedSymbol(ES6新引入),而引用数据类型则包括ObjectArray等。

作用域

Javascript中的作用域分为全局作用域和局部作用域。在函数内部声明的变量只在函数内部有效,称为局部变量;而在函数外部声明的变量则在整个程序中都有效,称为全局变量。

当在函数内部访问一个变量时,Javascript引擎首先尝试在当前作用域寻找该变量,如果找不到,则会逐层向上查找直到找到为止。我们把这种查找变量的过程称为变量的作用域链。

以下是一个具体的示例:

var num = 10;

function test() {
  console.log(num);
  var num = 20;
  console.log(num);
}

test();

以上代码的输出结果为:

undefined
20

原因是在函数内部,变量num先被声明了,这时候它的值还没有被赋值,所以首先输出的是undefined。接着在函数内部给num赋值为20,所以第二个输出结果为20。

内存问题

Javascript的内存分为栈内存和堆内存。基本数据类型的变量存储在栈内存中,而引用数据类型的变量存储在堆内存中。

当我们创建一个引用类型的变量时,实际上是在堆内存中为它分配了一块内存空间,而变量本身则是在栈内存中存储一个指向该堆内存空间的地址。当我们把一个引用类型的变量赋值给另一个变量时,实际上是让这两个变量指向同一个堆内存空间,它们共享同一份数据。

以下是一个具体的示例:

var obj1 = {name: '张三'};
var obj2 = obj1;

console.log(obj1.name); // 输出:张三

obj2.name = '李四';
console.log(obj1.name); // 输出:李四

以上代码中,我们创建了一个对象obj1,并将它赋值给obj2。这时候obj1obj2指向的是同一个堆内存空间,所以当我们修改obj2.name的时候,obj1.name的值也被改变了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:简单谈谈javascript中的变量、作用域和内存问题 - Python技术站

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

相关文章

  • javascript 定义初始化数组函数

    下面是关于“javascript 定义初始化数组函数”的完整攻略,包含两个示例说明。 定义初始化数组函数 在 JavaScript 中,我们可以通过函数方式来快速定义一个初始化数组的函数。需要注意的是,JavaScript 中的数组是一种特殊的对象,因此我们可以通过函数来返回一个数组,或者作为参数来传递数组。 定义方法一 下面是一种定义初始化数组的函数的方法…

    JavaScript 2023年5月27日
    00
  • 禁止弹窗中蒙层底部页面跟随滚动的几种方法

    请看以下完整攻略。 背景 在做弹窗时,通常会有蒙层的效果,以防止用户误点击背景操作。但是,这时候出现了一个问题,就是在弹窗出现的时候,蒙层底部的页面也跟着滚动了。影响了用户体验。因此,需要解决这个问题。 解决方案 在这里提供几种解决方案,可以根据实际情况选择其中一种或多种方法。 方案一:禁止body滚动 body { overflow: hidden; } …

    JavaScript 2023年6月11日
    00
  • Javascript基础之数组的使用

    Javascript基础之数组的使用 什么是数组? 数组是Javascript中的一种数据结构,用于存储多个相同类型的数据。一个数组可以包含任意数量的元素,且这些元素可以是数字、字符串、对象、甚至另一个数组。 如何声明一个数组? 声明一个数组的语法是 [],可以选择性地在中括号内包含多个元素。例如: var fruits = [‘apple’, ‘banan…

    JavaScript 2023年5月28日
    00
  • Javascript 模拟点击事件(点击链接与html点击) 兼容IE/Firefox

    这里是Javascript模拟点击事件(点击链接与HTML点击)兼容IE/Firefox的完整攻略,下面进行详细讲解,并提供两条示例说明。 前置知识 在了解模拟点击事件之前,需要先了解以下概念: 事件冒泡:指当一个元素触发某个事件(例如点击事件)时,此元素的父元素也会受到影响并触发同样的事件。 事件捕捉:指当一个元素触发某个事件时,此元素的父元素可以先于此元…

    JavaScript 2023年6月11日
    00
  • JS 获取文件后缀,判断文件类型(比如是否为图片格式)

    获取文件后缀和判断文件类型,是在JavaScript中经常用到的操作。具体的攻略如下: 1. 获取文件后缀 在JavaScript中获取文件后缀,可以使用字符串操作的方式,例如可以使用string.slice()或者string.substr()方法获取到文件名中 “.” 后面的字符串部分,即文件的后缀。 示例代码: const fileName = &qu…

    JavaScript 2023年5月27日
    00
  • 浅谈基于Token的WEB后台认证机制

    浅谈基于Token的WEB后台认证机制 什么是Token认证机制 Token是指一种用于认证的令牌,用于证明用户的身份。在Web应用程序中,Token通常指的是访问令牌(Access Token)或身份令牌(Identity Token)。身份令牌通常包含用户名、邮箱、用户ID等用户信息,并被加密以防止伪造。而访问令牌则会被用于向服务端发送请求,并验证请求的…

    JavaScript 2023年6月11日
    00
  • JavaScript arguments.callee作用及替换方案详解

    JavaScript arguments.callee作用及替换方案详解 引言 在 JavaScript 中,我们经常会用到函数的 arguments 对象。使用 arguments 可以获取函数调用时传入的所有参数,而 arguments.callee 是 arguments 对象的一个属性,它引用当前函数本身。 在 ES5 中,arguments.cal…

    JavaScript 2023年6月10日
    00
  • JS 实现计算器详解及实例代码(一)

    接下来我将详细讲解“JS 实现计算器详解及实例代码(一)”这篇文章的完整攻略。 文章概述 该文章是一篇教程,主要介绍如何使用JavaScript实现一个基本的计算器。该计算器可以进行加、减、乘、除四种运算,同时还可以进行按位取反、求余、正负号切换和小数点输入等功能。该文章主要包括以下几个部分: 介绍计算器的基本思路和需求分析 讲解HTML和CSS的基本结构和…

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