Day16 - 为什么一定要有块级作用域

简介: Day16 - 为什么一定要有块级作用域

知识点讲解


在Javascript提出块级作用域,主要是为了解决Javascript中的一个重要的设计缺陷 。


变量提升特性导致的大量与直觉不符的代码


变量提升是什么?


(function() {
  console.log(v)
  var v = 123
})()


js 在变量声明提升的时候会将 var 声明的变量以及 用关键字函数声明的函数都会提升到当前作用域的顶端 。赋值语句在原地等待赋值。


变量提升的优点是降低程序的编写难度。


为什么这么说,其实原始的程序在编写的时候是有明确的顺序要求的。


比如我们下面就看一个史前语言Pascal语言


网络异常,图片无法展示
|


完整的程序结构


网络异常,图片无法展示
|


这就好比王者荣耀为了降低操作难度不用回家买装备一样。


违反直觉的事


但是这种编写方法就会带来一些问题。毕竟是擅自修改了执行的逻辑。


主要分为线面两方面


内层变量会覆盖外层变量


var tmp = new Date();
function f() {
  console.log(tmp);
  if (false) {
    var tmp = 'hello world';
  }
}
f(); // undefined


以上程序,全局定义的变量,由于后面的程序定义了同名变量程序,居然凭空消失。


本应销毁的变量没有被销毁


这个其实就是著名的循环陷阱问题。前面几天说过就不仔细说了。


var s = 'hello';
for (var i = 0; i < s.length; i++) {
  console.log(s[i]);
}
console.log(i); // 5


面试攻略


谈到块级作用域的影响,多班会有人先谈现象,不谈本质。建议从语言缺陷完善的角度分析这个问题。


相关文章
|
存储 Cloud Native Linux
C++ const关键字
C++ const关键字
|
12天前
|
存储 缓存 JavaScript
哪些情况适合使用块级作用域,哪些情况适合使用函数作用域?
【10月更文挑战第29天】块级作用域和函数作用域在不同的场景下各有优势,合理地选择和运用这两种作用域可以使JavaScript代码更加清晰、高效和易于维护。在实际开发中,需要根据具体的业务需求、代码结构和编程模式来决定使用哪种作用域,或者在适当的情况下结合使用两者,以达到最佳的编程效果。
|
12天前
|
JavaScript 前端开发
块级作用域和函数作用域有什么区别?
【10月更文挑战第29天】块级作用域和函数作用域在JavaScript中各有特点和用途。块级作用域提供了更精细的变量控制,有助于避免变量提升和意外的全局变量污染等问题;而函数作用域则在函数封装和模块化编程等方面有着重要的应用。在实际开发中,需要根据具体的需求和场景合理地选择使用哪种作用域来声明变量和组织代码。
|
12天前
|
JavaScript 前端开发 Java
块级作用域和函数作用域在执行效率上有什么不同?
【10月更文挑战第29天】块级作用域和函数作用域在执行效率上各有特点。块级作用域在变量查找速度、内存管理和闭包处理等方面具有一定的优势,尤其是在处理复杂的作用域嵌套和循环中的变量引用时,能够提供更高效和更准确的执行结果。然而,在实际应用中,由于现代JavaScript引擎的优化以及大多数场景下性能差异并不十分显著,因此不能简单地说哪种作用域的执行效率绝对更高,而是需要根据具体的代码逻辑、应用场景和性能需求来综合考虑和选择使用哪种作用域。
|
4月前
|
编译器
C 中的变量声明
【7月更文挑战第2天】C 中的变量声明。
28 1
|
6月前
|
C++
c++变量作用域
c++变量作用域
59 2
|
6月前
|
JavaScript
块级作用域、变量提升
块级作用域、变量提升
27 1
|
6月前
|
C++
C++ 变量作用域
C++ 变量作用域
48 0
|
编译器 C语言
C中的变量声明
C 中的变量声明。
65 3
|
程序员 C++
C++之const关键字
关于C++的const的爱恨情仇
107 0