六十天前端强化训练之第八天之JavaScript核心之ES6变量与箭头函数(第8-14天:JavaScript核心)

=====欢迎来到编程星辰海的博客讲解======

前面第1-7天我写的博客是围绕HTML5与CSS3基础,接下来第8-14天我会围绕JavaScript核心,跟上脚步的同学加油,没跟上的同学不要气馁,我相信所有同学都可以做到的,加油!

目录

一、ES6变量声明(let/const)

1 块级作用域

2 不存在变量提升

3 禁止重复声明

4 暂时性死区(TDZ)

5 const的特殊性

二、箭头函数详解

1 基础语法

2 this绑定机制

3 参数处理

4 使用限制

三、核心代码示例

1 作用域差异案例

2 箭头函数实战

四、var/let/const 作用域差异详解

1. 作用域类型

2. 变量提升(Hoisting)

3. 重复声明

4. 全局对象属性

5. const 的不可变性

五、核心代码示例

示例1:作用域差异对比

示例2:const 的不可变性

六、实现效果截图

示例1输出结果:

七、学习要点总结

八、扩展阅读推荐


一、ES6变量声明(let/const)

ES6新增了letconst声明方式,解决了传统var的缺陷:

1 块级作用域

JAVASCRIPT

{
  var a = 1
  let b = 2
  const c = 3
}
console.log(a) // 1
console.log(b) // ReferenceError: b is not defined
console.log(c) // ReferenceError: c is not defined

2 不存在变量提升

JAVASCRIPT

console.log(d) // undefined
var d = 4

console.log(e) // ReferenceError: Cannot access 'e' before initialization
let e = 5
3 禁止重复声明

JAVASCRIPT

let f = 10
let f = 20 // SyntaxError: Identifier 'f' has already been declared

var g = 30
var g = 40 // 允许重复声明
4 暂时性死区(TDZ)

JAVASCRIPT

if (true) {
  tmp = 'abc' // ReferenceError: Cannot access 'tmp' before initialization
  let tmp
}
5 const的特殊性

JAVASCRIPT

const PI = 3.1415
PI = 3.14 // TypeError: Assignment to constant variable

const obj = { name: 'Alice' }
obj.age = 30 // 允许修改属性
obj = {} // TypeError: Assignment to constant variable


二、箭头函数详解

1 基础语法

JAVASCRIPT

// 传统函数
function add(a, b) {
  return a + b
}

// 箭头函数
const add = (a, b) => a + b
2 this绑定机制

JAVASCRIPT

const person = {
  name: 'Bob',
  sayName: function() {
    setTimeout(function() {
      console.log(this.name) // undefined(普通函数的this指向window)
    }, 100)
  },
  sayNameArrow: function() {
    setTimeout(() => {
      console.log(this.name) // Bob(箭头函数继承外层this)
    }, 100)
  }
}
3 参数处理

JAVASCRIPT

// 单参数可省略括号
const square = x => x * x

// 无参数时需要括号
const getRandom = () => Math.random()

// rest参数处理
const sumAll = (...numbers) => numbers.reduce((acc, cur) => acc + cur, 0)
4 使用限制

JAVASCRIPT

// 不能作为构造函数
const Foo = () => {}
new Foo() // TypeError: Foo is not a constructor

// 没有arguments对象
const showArgs = () => console.log(arguments)
showArgs(1,2,3) // ReferenceError: arguments is not defined


三、核心代码示例

1 作用域差异案例

HTML

<script>
function scopeDemo() {
  if (true) {
    var a = 'var变量'
    let b = 'let变量'
    const c = 'const变量'
  }
  console.log(a) // var变量
  console.log(b) // ReferenceError
  console.log(c) // ReferenceError
}
scopeDemo()
</script>
2 箭头函数实战

JAVASCRIPT

// 数组处理
const numbers = [1, 2, 3, 4]
const doubled = numbers.map(n => n * 2)

// 事件处理
button.addEventListener('click', () => {
  console.log(this) // 继承自外围作用域的this
})

// Promise链式调用
fetchData()
  .then(data => data.json())
  .then(json => processData(json))
  .catch(error => console.error('Error:', error))


四、var/let/const 作用域差异详解

1. 作用域类型
  • var:函数作用域(Function Scope)

    • 变量在函数内部声明时有效,若在函数外部或全局作用域声明则为全局变量。
    • 常见问题:循环变量泄漏到全局、重复声明覆盖。
  • let/const:块级作用域(Block Scope)

    • 变量仅在声明所在的代码块(如 {})内有效。
    • 修复了 var 的变量泄漏问题,符合直觉的作用域隔离。
2. 变量提升(Hoisting)
  • var:存在变量提升,声明被提升到作用域顶部,但初始化未被提升。

    JAVASCRIPT

    console.log(a); // undefined
    var a = 10;
    
  • let/const:存在暂时性死区(Temporal Dead Zone, TDZ)

    • 变量在声明前不可访问,否则抛出 ReferenceError

    JAVASCRIPT

    console.log(b); // ReferenceError
    let b = 20;
    
3. 重复声明
  • var:允许重复声明,可能导致意外覆盖。

    JAVASCRIPT

    var c = 1;
    var c = 2; // 合法,但 c 被覆盖为 2
    
    
  • let/const:禁止重复声明,严格约束代码质量。

    JAVASCRIPT

    let d = 3;
    let d = 4; // SyntaxError: Identifier 'd' has already been declared
    
4. 全局对象属性
  • var:全局声明的变量会成为 window 对象的属性。

    JAVASCRIPT

    var e = 5;
    console.log(window.e); // 5 (浏览器环境)
    
  • let/const:全局声明的变量不会添加到 window 对象。

    JAVASCRIPT

    let f = 6;
    console.log(window.f); // undefined
    
5. const 的不可变性
  • 基本类型:值不可修改。

    JAVASCRIPT

    const PI = 3.14;
    PI = 3.1415; // TypeError: Assignment to constant variable
    
  • 引用类型:内存地址不可修改,但属性可变更。

    JAVASCRIPT

    const obj = { name: 'Alice' };
    obj.name = 'Bob'; // 允许修改属性
    obj = {}; // TypeError: Assignment to constant variable
    

五、核心代码示例

示例1:作用域差异对比

HTML

<!DOCTYPE html>
<script>
  // var 的变量泄漏问题
  function varExample() {
    for (var i = 0; i < 3; i++) {
      setTimeout(() => console.log('var:', i), 100); // 输出 3, 3, 3
    }
  }

  // let 的块级作用域解决泄漏问题
  function letExample() {
    for (let j = 0; j < 3; j++) {
      setTimeout(() => console.log('let:', j), 100); // 输出 0, 1, 2
    }
  }

  varExample();
  letExample();
</script>
示例2:const 的不可变性

JAVASCRIPT

// 修改 const 对象属性
const user = { name: 'Charlie', age: 30 };
user.age = 31; // 允许修改
console.log(user); // { name: 'Charlie', age: 31 }

// 尝试重新赋值(报错)
user = {}; // TypeError: Assignment to constant variable


六、实现效果截图

示例1输出结果:

TEXT

var: 3
var: 3
var: 3
let: 0
let: 1
let: 2

效果说明:

  1. 作用域演示区

    • 点击 "运行 var 示例" 按钮:连续输出 3 次 var: 3
    • 点击 "运行 let 示例" 按钮:依次输出 let: 0let: 1let: 2
  2. const 演示区

    • 点击 "修改对象属性":显示属性修改成功
    • 点击 "尝试重新赋值":显示 TypeError 错误

七、学习要点总结

特性varletconst
作用域函数作用域块级作用域块级作用域
变量提升✅(声明提升)❌(存在TDZ)❌(存在TDZ)
重复声明允许禁止禁止
全局属性绑定
可变性完全可变完全可变值不可变(引用类型属性可变)

八、扩展阅读推荐

  1. 官方文档

  2. 优质文章


通过深入理解 var/let/const 的作用域差异及箭头函数的特性,能编写出更安全、易维护的现代JavaScript代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程星辰海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值