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

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使用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
  • 原生JS分页展示效果(点击分页看效果)

    下面是“原生JS分页展示效果”的完整攻略。 前言 在实际项目开发中,通常都需要使用分页功能。常用的分页库有jQuery的pagination.js,但如果不想依赖jQuery,则可以使用原生JS实现分页。本篇文章将介绍如何使用原生JS实现分页展示效果。 实现步骤 第一步:创建分页HTML结构 首先,需要创建一个包含分页按钮的HTML结构。例如: <di…

    JavaScript 2023年6月11日
    00
  • 实现非常简单的js双向数据绑定

    实现简单的双向数据绑定,主要需要掌握以下两个知识点: 如何监听输入框的变化事件并更新数据模型 如何监听数据模型的变化并更新对应的HTML元素 下面我们分别介绍这两个知识点的实现方法,以及两个示例说明。 监听输入框变化事件 在HTML中,输入框的值可以通过value属性获取到。我们可以使用EventTarget.addEventListener()方法来监听输…

    JavaScript 2023年6月10日
    00
  • 微信小程序 倒计时组件实现代码

    下面就来分享微信小程序中倒计时组件的实现过程吧。 准备工作 在开始具体讲解之前,需要对微信小程序的基础知识有一定的了解,包括:- 小程序的目录结构- WXML、WXSS、JS、JSON 文件的作用- 小程序的基础组件和事件绑定等操作 倒计时组件实现步骤 1. 创建小程序项目 首先,在微信开发者工具中创建一个基础的小程序项目。 2. 创建倒计时组件 在项目中创…

    JavaScript 2023年6月11日
    00
  • Node.js控制器Controller使用教程

    Node.js控制器Controller使用教程 在Node.js中,控制器(Controller)用于处理请求并返回响应。控制器可以将请求路由到不同的处理程序(Handler)中,或者对请求进行处理并返回响应。 基本的控制器结构 通常来说,一个控制器至少具备两个功能:接收请求和返回响应。以下是一个基本的控制器结构示例: // 引入相关模块 const ex…

    JavaScript 2023年5月28日
    00
  • js程序中美元符号$是什么

    美元符号 $ 在 JavaScript 中代表一个函数或对象。在 jQuery 库中,$ 代表 jQuery 函数,因此 $ 变得非常常见。在许多网站和 Web 应用程序中,如果你想使用 jQuery 库中的函数,则必须首先使用 $ 变量。下面是一个示例代码片段: $(document).ready(function(){ $("button&qu…

    JavaScript 2023年6月10日
    00
  • Vue实现调用PC端摄像头实时拍照

    下面我来详细讲解一下Vue实现调用PC端摄像头实时拍照的完整攻略。 1. 获取用户的设备权限和相机设备 在Vue中将调用PC端摄像头分为两步,首先是获取用户的设备权限和相机设备。 //获取用户媒体设备(摄像头) if (navigator.mediaDevices.getUserMedia) { navigator.mediaDevices.getUserM…

    JavaScript 2023年6月11日
    00
  • js实现一个逐步递增的数字动画

    JS实现逐步递增数字动画的完整攻略示例: 步骤一: HTML结构首先,我们需要在HTML中创建一个目标容器来显示数字动画的值,如 ,这是一个示例结构,可以根据实际情况进行修改。 步骤二: CSS样式可以根据自己的需求进行样式设计,这里建议将目标容器与数字本身分离,用一个样式来设置它们的样式。如: .num { font-size: 40px; color: …

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