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日

相关文章

  • 详解javascript表单的Ajax提交插件的使用

    详解Javascript表单的Ajax提交插件的使用 1. AJAX 是什么? AJAX 即 Asynchronous Javascript And XML (异步 JavaScript 和 XML)。在不重新加载整个页面的情况下,可以通过 AJAX 在后台与服务器进行数据交互。使用 AJAX,可以实现异步加载数据,提高用户体验。 2. 表单提交流程 在传统…

    JavaScript 2023年6月11日
    00
  • javascript表单验证使用示例(javascript验证邮箱)

    下面就为您详细讲解“javascript表单验证使用示例(javascript验证邮箱)”的完整攻略。 一、表单验证的基本原理 表单验证是指对用户提交的表单数据进行校验,以保证数据的合法性和完整性。在前端开发中,常用的表单验证方式包括: HTML表单验证:利用HTML表单的标准属性和属性值,来对表单数据进行校验和限制; javascript表单验证:利用ja…

    JavaScript 2023年6月10日
    00
  • 用 Javascript 验证表单(form)中的单选(radio)值

    下面是用 JavaScript 验证表单中的单选(radio)值的完整攻略: 1. 获取单选按钮的值 首先,我们需要通过 document.getElementsByName() 方法获取所有同名的单选按钮,然后循环遍历每个单选按钮,判断哪个单选按钮被选中(即 checked 属性为 true)。 下面是一个获取选中的单选按钮值的示例代码: // 获取所有同…

    JavaScript 2023年6月10日
    00
  • js中eval方法详解之eval方法的初级应用

    JS中eval方法详解之eval方法的初级应用 什么是eval方法? eval方法是JavaScript的内置函数,可以用来执行一个JavaScript字符串。eval函数只接受一个参数,即要执行的JavaScript字符串。eval会将接收到的字符串当做JavaScript代码执行,并返回最后一个语句的执行结果。 eval方法的使用场景 因为eval方法可…

    JavaScript 2023年5月28日
    00
  • JavaScript Ajax请求

    JavaScript Ajax请求的完整攻略: 1. 创建XMLHttpRequest对象(XHR) 创建XHR对象是Ajax请求的第一步。XHR是一个内置的JavaScript对象,允许在不刷新页面的情况下向服务器发送请求。 var xhr = new XMLHttpRequest(); 2. 准备请求 在发起请求之前,需要设置请求的各个参数,如请求类型、…

    Web开发基础 2023年3月30日
    00
  • javascript 三种方法实现获得和设置以及移除元素属性

    JavaScript 三种方法实现获得和设置以及移除元素属性 在 JavaScript 中,我们可以通过以下三种不同的方法来获取、设置或者移除 DOM 元素的属性: getAttribute() 和 setAttribute() .属性名 .dataset 1. getAttribute() 和 setAttribute() 方法 getAttribute(…

    JavaScript 2023年5月28日
    00
  • 基于JavaScript实现单例模式

    让我来详细讲解一下“基于JavaScript实现单例模式”的完整攻略。 什么是单例模式? 单例模式是一种设计模式,它保证一个类只有一个实例,并提供一个全局访问点来访问这个实例。在JavaScript中,由于它是一种动态语言,所以没有像Java、C++等静态语言那样的固有的单例模式实现方式,但是我们可以用JavaScript的一些语言特性来模拟出单例模式。 单…

    JavaScript 2023年6月10日
    00
  • 论JavaScript模块化编程

    论JavaScript模块化编程 JavaScript的模块化编程是指将一个大型的应用程序划分为小的、互相依赖的模块,每个模块具有特定的功能,实现模块的高内聚、低耦合的特性,方便代码的维护和复用。本文将介绍如何使用JavaScript进行模块化编程,并分别通过常规模块化和ES6模块化两个实例进行说明。 常规模块化 常规模块化是JavaScript模块化的老方…

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