js变量、作用域及内存详解

yizhihongxing

JS变量、作用域及内存详解

JavaScript 是一门动态、解释型语言,定义了多种不同类型的值,比如数字、字符串、布尔值、对象等。在 JavaScript 中,变量用于算术计算、字符串拼接、逻辑表达式等各种的场景,变量是引用值和原始值的存储体。

变量

变量的定义与命名规则

在 JavaScript 中,变量的定义使用关键字 varlet,如果不带任何关键字直接声明变量,则默认为全局变量。命名规则遵循驼峰式命名规则,下划线方式也很常见。同时在变量命名时,要避开 JavaScript 的保留字。

// 声明变量
var name = '张三';
let age = 18;
const PI = 3.14;

// 不带关键字的变量默认为全局变量
name1 = '李四';

// 命名规则遵循驼峰式规则,在变量命名时应避免使用保留字
var firstName = 'Linda';
var user_name = 'Tom';

原始值与引用值

在 JavaScript 中,基本类型的数据包括 numberstringbooleannullundefined,它们都属于原始值类型,可以直接进行比较。引用值的数据类型包括 objectarrayfunction,它们在进行比较时会判断它们是否是同一个引用。

// 原始值类型的比较
var num1 = 1;
var num2 = 1;
if (num1 === num2) {
  console.log('num1 equal num2');
}

// 引用值类型的比较
var arr1 = [1, 2, 3];
var arr2 = arr1;
if (arr1 === arr2) {
  console.log('arr1 equal arr2');
}

变量的声明提升

JavaScript 在执行代码时,会先扫描代码中的所有函数和变量的声明,将它们的声明提升到当前作用域的最前面,因此,JavaScript 中的变量和函数可以先使用后声明。

console.log(name); // undefined
var name = '张三';

作用域

作用域定义

在 JavaScript 中,作用域指的是变量或函数的可访问范围。在 ES5 中,JavaScript 采用的作用域是函数作用域。在 ES6 中,JavaScript 新增了块级作用域,在块级作用域中声明的变量只在该作用域内起作用。

函数作用域

在函数中定义的变量不会在函数外部访问到,这种限制作用域的语法被称为封闭性。在 JavaScript 中,函数作用域可以通过内部定义变量的方式来实现,函数内部定义的变量在函数外部是不可访问的。

function test() {
  var name = '张三';
}
console.log(name); // ReferenceError: name is not defined

块级作用域

在块级作用域中声明的变量只在该作用域内起作用,不会影响到函数作用域和全局作用域中的变量。

function test() {
  var a = 1;
  if (true) {
    let b = 2;
    var c = 3;
  }
  console.log(a); // 1
  console.log(b); // ReferenceError: b is not defined
  console.log(c); // 3
}

内存管理

JavaScript 的内存管理方式

JS的内存管理是自动的,开发人员不必关注内存的分配和回收,JavaScript 引擎会根据开发人员的代码流程进行动态的内存管理。

var str = 'Hello World';
var num = 100;
var obj = { name: '张三', age: 18 };
var arr = [1, 2, 3];
var fun = function () {
  console.log('function');
}

以上变量在声明时都会占用内存空间,变量在不再需要时,由 JavaScript 引擎进行自动的垃圾回收,释放占用的内存空间。如果引用多个变量的对象或数组失去了所有引用,这些变量将等待 JavaScript 引擎的垃圾回收。

内存泄漏

内存泄漏指的是应该被垃圾回收器回收的对象却被保留在内存中的情况。一些常见的内存泄漏情况包括:

  • 全局变量导致的内存泄漏
  • 递归循环引用导致的内存泄漏
  • DOM 引用导致的内存泄漏
// 全局变量导致的内存泄漏
var name = '张三';

// 递归循环引用导致的内存泄漏
function test() {
  var obj1 = {};
  var obj2 = {};
  obj1.obj2 = obj2;
  obj2.obj1 = obj1;
}
test();

总结

JavaScript 中,变量可以分为原始值和引用值。在 JavaScript 中,作用域指的是变量或函数的可访问范围,可以通过封闭函数和块级作用域来实现。在内存管理方面,JavaScript 引擎通过动态管理内存,开发人员无需关注内存的分配和回收。内存泄漏是一种应该被垃圾回收器回收的对象却一直占用着内存的情况。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js变量、作用域及内存详解 - Python技术站

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

相关文章

  • js获取元素到文档区域document的(横向、纵向)坐标的两种方法

    JS获取元素到文档区域document的坐标是一个常见的需求,这个过程可以有两种常见的方法来实现。 方法一:使用offsetLeft、offsetTop逐层累加 offsetLeft和offsetTop属性分别可以获取元素左、上边框到其容器元素上边框的距离。如果我们需要获取元素到文档区域document的水平和竖直方向的距离,则需要逐层遍历每个容器元素,将其…

    JavaScript 2023年6月10日
    00
  • js页面跳转的问题(跳转到父页面、最外层页面、本页面)

    JS页面跳转的问题主要可以分为三种情况:跳转到父页面、最外层页面、本页面。下面详细说明每种情况如何进行页面跳转。 跳转到父页面 跳转到父页面时,我们需要使用 window.parent 对象来实现。具体实现方式如下: // 跳转到父页面 window.parent.location.href = ‘跳转的目标页面的链接’ 示例代码如下: <!DOCTY…

    JavaScript 2023年6月11日
    00
  • 详解JavaScript基于面向对象之创建对象(1)

    首先回答一下这篇“详解JavaScript基于面向对象之创建对象(1)”的攻略。 该文章主要介绍了JavaScript中创建对象的方式,具体内容包括: 对象字面量创建对象 构造函数创建对象 Object.create方法创建对象 上述方法是JavaScript中最常见的创建对象的方式,其中对象字面量的使用最为广泛,而构造函数和Object.create方法则…

    JavaScript 2023年5月27日
    00
  • 动态JavaScript所造成一些你不知道的危害

    当涉及到使用JavaScript编写具有动态性的应用程序时,可能会有一些与安全相关的问题,因为动态JavaScript代码可能会被攻击者利用以进行欺诈、窃听或入侵。以下是一些动态JavaScript会带来的危害和如何防止它们的方法: XSS 攻击 跨站点脚本攻击(XSS)是一种攻击,攻击者利用动态JavaScript来执行恶意代码并跨越不同的域。这可以导致攻…

    JavaScript 2023年5月18日
    00
  • 常用JS加密编码算法代码第2/2页

    “常用JS加密编码算法代码第2/2页”是一篇介绍常用JS加密和编码算法的文章,其中包含了完整的代码示例。为了更好地理解和使用这些算法,可以按照以下步骤进行操作: 阅读文章,理解各种加密和编码算法的原理和用途。文章中提到了几种常用的算法,包括Base64编码、MD5加密、SHA1加密、AES加密等,在使用这些算法之前,需要先理解其基本原理。 下载代码示例,并在…

    JavaScript 2023年5月20日
    00
  • 关于RxJS Subject的学习笔记

    关于RxJS Subject的学习笔记,我会从以下几个方面进行详细讲解: Subject的介绍和作用 Subject的使用方式和示例 Subject的一些应用场景和注意事项 1. Subject的介绍和作用 RxJS Subject是一种特殊的Observable,允许像事件一样多播到多个观察者。Subject既是观察者也是可观察对象。简单来说,Subjec…

    JavaScript 2023年5月27日
    00
  • JavaScript实例–创建一个欢迎cookie

    接下来我将为您详细讲解如何创建一个欢迎cookie的完整攻略。 1. 前言 在开始之前,我们需要明确一些概念: 1.1 cookie是什么? Cookie(中文:HTTP cookie)是指网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。 1.2 Javascript中的document.cookie是什么? do…

    JavaScript 2023年6月11日
    00
  • django框架cookie和session用法实例详解

    下面我就来详细讲解“django框架cookie和session用法实例详解”的完整攻略。 简介 在Web开发中,cookie和session是两个常用的用于存储客户端状态的方式。在django框架中,cookie和session都有着非常广泛的应用。 其中,cookie是一种存储在用户本地浏览器中的数据,它可以用于识别用户身份、记录用户访问网站的历史记录等…

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