365天打卡记录
🔥 创作不易、大家帮然叔 B栈 一键三连
- [如何利用闭包完成类库封装] 📺 Billbill视频 📚 掘金文稿 🐱 Github
- [谈谈闭包与即时函数的应用] 📺 Billbill视频 📚 掘金文稿 🐱 Github
- [分析一下箭头语法为什么不能当做构造函数] 📺 Billbill视频 📚 掘金文稿 🐱 Github
- [闭包与科里化、偏应用函数的关系] 📺 Billbill视频 📚 掘金文稿 🐱 Github
- [如何用闭包制造惰性函数?] 📺 Billbill视频 📚 掘金文稿 🐱 Github
- [什么是闭包?如何产生闭包] 📺 Billbill视频 📚 掘金文稿 🐱 Github
- [new 一个构造函数,如果函数返回
return {}、return null,return 1,return true会发生什么情况?] 📺 Billbill视频 📚 掘金文稿 🐱 Github - [new 一个函数发生了什么?] 📺 Billbill视频 📚 掘金文稿 🐱 Github
- [判断数据类型的方式有哪些?] 📺 Billbill视频 📚 掘金文稿 🐱 Github
- [Number() 的存储空间是多大?如果后台发送了一个超过最大限制的数字怎么办?] 📺 Billbill视频 📚 掘金文稿 🐱 Github
- [0.1 + 0.2 === 0.3 嘛?为什么?怎么解决?] 📺 Billbill视频 📚 掘金文稿 🐱 Github
- [JS 整数是怎么表示的?] 📺 Billbill视频 📚 掘金文稿
知识点讲解
在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
面试攻略
谈到块级作用域的影响,多班会有人先谈现象,不谈本质。建议从语言缺陷完善的角度分析这个问题。