JavaScript基础知识精讲:数据类型、变量提升、作用域、闭包和垃圾回收机制 | 青训营

61 阅读3分钟

引言

JavaScript是一种动态、灵活且功能丰富的编程语言,在前端开发中扮演着重要角色。了解JavaScript的基本概念和特性是成为高效开发人员的关键。本文将介绍JavaScript的数据类型、变量提升、作用域、闭包和垃圾回收机制,并提供相关的代码示例。

1.数据类型

JavaScript支持多种数据类型,包括数字、字符串、布尔值、Null、Undefined和Symbol。不同的数据类型适用于不同的数据操作和计算。

let number = 42;
let string = "Hello, World!"; 
let bool = true; 
let nullValue = null; 
let undefinedValue = undefined; 
let symbol = Symbol("unique"); 
console.log(number); // 输出:42 
console.log(string); // 输出:"Hello, World!" 
console.log(bool); // 输出:true 
console.log(nullValue); // 输出:null console.log(undefinedValue); 

 console.log(symbol); // 输出:Symbol(unique)

2.变量提升:

JavaScript中的变量提升是指在代码执行之前,JavaScript引擎会将变量和函数的声明提升到作用域的顶部,且可以在声明之前进行访问。这意味着我们可以在变量声明之前使用变量,而不会报错。

console.log(age); // 输出:undefined var age = 25; 
console.log(age); // 输出:25

在上面的代码中,变量age在声明之前使用输出结果为undefined,而在赋值之后输出结果为25

对于函数的提升,函数声明会被完整提升,包括函数体的定义。

hello(); // 输出:Hello, world! 
function hello() { 
    console.log("Hello, world!"); 
}

在上面的代码中,函数hello在声明之前就被调用,而不会报错。

3.作用域

作用域是变量的可访问性和生命周期所依赖的区域。在JavaScript中,有全局作用域和局部作用域(函数作用域和块级作用域)两种。

  • 全局作用域:全局作用域中声明的变量可以在代码的任何地方访问。
let name = "John"; 
function sayHello() 
{ 
   console.log(`Hello, ${name}!`); 
} sayHello(); // 输出:Hello, John!
  • 函数作用域:函数作用域中声明的变量只在函数内部可访问,函数外部无法访问。
function doSomething() { 
let message = "Hello, World!"; 
console.log(message);
} 
doSomething(); // 输出:Hello, World! 
console.log(message); // 抛出ReferenceError: message is not defined
  • 块级作用域:在ES6之前,JavaScript没有块级作用域。但使用letconst关键字可以创建块级作用域。
function doSomething() { 
if (true) { 
let message = "Hello, World!"; 
    console.log(message); 
} 
    console.log(message); // 抛出ReferenceError: message is not defined 
} 
doSomething(); // 输出:Hello, World!

4.闭包

闭包是指一个函数可以访问并使用其词法作用域中的变量,即使函数在词法作用域外被调用。通过闭包,函数可以“记住”定义时的环境,并在稍后的时候使用。

    function outer() {
     let name = "John";
      function inner() { 
       console.log(`Hello, ${name}!`); 
    } 
        return inner; 
  } 
let greeting = outer(); 
greeting(); // 输出:Hello, John!

在上面的代码中,函数inner形成了闭包,可以访问outer函数中的变量name,即使inner函数在outer函数的词法作用域外被调用。

5. 垃圾回收:

JavaScript具有自动垃圾回收机制,它负责检测和释放不再使用的内存,以便在需要时重用该内存。垃圾回收机制通过标记清除和引用计数来实现。

  • 标记清除:当变量无法被访问时,垃圾回收器会将其标记为垃圾,并在稍后的垃圾回收周期中回收它们占用的内存空间。
  • 引用计数:记录每个值被引用的次数。当引用次数为0时,垃圾回收器会回收对应的内存空间。

垃圾回收器周期性地运行,并根据算法确定哪些内存可以回收。

总结

JavaScript作为一种动态、灵活的编程语言,具有多种数据类型、变量提升、作用域、闭包和垃圾回收机制等特性。通过掌握这些概念,开发人员可以更好地理解和应用JavaScript,提高代码的可维护性和性能。