=====接待来到编程星辰海的博客讲解======
前面第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新增了let和const声明方式,解决了传统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
复制代码
结果阐明:
- 作用域演示区:
- 点击 "运行 var 示例" 按钮:一连输出 3 次 var: 3
- 点击 "运行 let 示例" 按钮:依次输出 let: 0, let: 1, let: 2
- const 演示区:
- 点击 "修改对象属性":显示属性修改成功
- 点击 "尝试重新赋值":显示 TypeError 错误
七、学习要点总结
特性varletconst作用域函数作用域块级作用域块级作用域变量提拔✅(声明提拔)❌(存在TDZ)❌(存在TDZ)重复声明允许克制克制全局属性绑定是否否可变性完全可变完全可变值不可变(引用类型属性可变) 八、扩展阅读保举
- 官方文档:
- MDN let
- MDN const
- 箭头函数 - MDN
- 优质文章:
- ES6 入门教程 - 阮一峰
- JavaScript 变量声明:var, let, const 深度解析
通过深入明白 var/let/const 的作用域差异及箭头函数的特性,能编写出更安全、易维护的现代JavaScript代码。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |