JS - 闭包中的基础数据类型和引用类型

1 篇文章 0 订阅

在JavaScript中,闭包是一个函数和声明该函数的词法环境的组合。闭包让你可以从内部函数访问外部函数作用域中的变量。当讨论闭包与基础数据类型(原始数据类型)和复杂数据类型(引用数据类型)的关系时,重要的是要理解JavaScript中变量如何存储和访问这两种类型的值,以及这对闭包的影响。

基础数据类型(原始数据类型)

基础数据类型包括:String、Number、Boolean、Null、Undefined、Symbol(ES6引入)和BigInt(ES2020引入)。这些类型的特点是:

  • 值直接存储在变量中:当你操作这些类型的变量时,实际上是在操作存储在变量中的值本身。
  • 按值传递:当将一个基础类型的变量赋值给另一个变量时,会创建这个值的一个副本。

复杂数据类型(引用数据类型)

复杂数据类型主要是Object,包括数组(Array)、函数(Function)和其他所有非原始类型。这些类型的特点是:

  • 变量存储的是对值的引用:变量实际上存储的是一个指向值所在内存位置的引用,而不是值本身。
  • 按引用传递:当将一个对象赋值给另一个变量时,赋值的是引用,这意味着两个变量指向内存中的同一个对象。

闭包中的基础数据类型和复杂数据类型

在闭包中使用基础数据类型和复杂数据类型时,重要的区别在于如何访问和修改这些数据:

  • 基础数据类型:闭包内部的函数可以访问外部函数作用域中的基础数据类型变量。但是,由于基础数据类型是按值传递的,闭包内部的更改不会影响外部作用域中的原始变量。
function createCounter() {
    let count = 0; // 基础数据类型
    return function() {
        count += 1;
        return count;
    };
}
const counter = createCounter();
console.log(counter()); // 输出: 1
console.log(counter()); // 输出: 2
  • 复杂数据类型:闭包内部的函数可以访问和修改外部函数作用域中的复杂数据类型变量。由于这些变量是按引用传递的,闭包内部的更改会影响到原始对象。
function createObj() {
    let obj = {count: 0}; // 复杂数据类型
    return function() {
        obj.count += 1;
        return obj.count;
    };
}
const objCounter = createObj();
console.log(objCounter()); // 输出: 1
console.log(objCounter()); // 输出: 2

总结

闭包允许函数访问并操作其外部作用域中的变量。基础数据类型(按值传递)和复杂数据类型(按引用传递)在闭包中的主要区别在于,对复杂数据类型的修改会影响到闭包外部的原始对象,而基础数据类型的修改则不会。这种行为对于理解和使用闭包来维护和操作状态非常重要。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值