You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Web APIs 难道不是 window 旗下的吗? -> 所谓的 GO 就是 VO 吗? -> GO、VO、window、this、[[scope]] -> window指向GO,VO里边存储的是被声明的变量,let/const声明的变量不会放到 GO 旗下,var 声明的变量则会放到 GO 旗下,所以 window旗下会有 var 声明的变量,但不管怎样,全局声明的变量,都是全局变量!
函数 one 也在 Global 里边 -> Script存储的是用 let、const 声明的变量
Closure是特殊的,它旗下的值是可以被保存下来的,相当于在 two 的作用链途中留下了版本记录或者说痕迹
functionone(){vara=1;varb=2;functiontwo(){varc=3;debugger;console.log(++a);}returntwo;}letx=666vary=777constz=888lettwo=one();two();// 2// 第二次执行 two,two 中的 a 会找到上一次执行 two 所记录的 a 值two();// 3
letfn=()=>{console.log(this);console.log(arguments);//Uncaught ReferenceError: arguments is not defined}console.log(fn.prototype);//undefinedfn();newfn();//Uncaught TypeError: fn is not a constructor
10.5 构造函数
构造函数中的 THIS 是当前类的实例
functionfn(){}letobj=newfn();
10.6 call/apply/bind
call/apply/bind 可以改变函数中 this 的指向
第一个参数是改变 this 指向(非严格模式下,传递 null/undefined 指向也是 window)
/* let name = 'zhufeng'{ //ReferenceError: Cannot access 'name' before initialization console.log(name) let name = 'jiagou'} */functiontwo(){console.log(a);}functionone(){vara=2;two();}vara=1;one();letglobalEC={a: 1,one(){},two(){}}lettwoEC={this: globalThis,outer: globalEC,variableEnvironment: {a: 1,two(){console.log(a)}}//出生的地方}vartwoEc={outer: globalEC};console.log(twoEC.outer.a);
JavaScript 核心知识点
1. 栈
栈
者,存储货物或供旅客住宿的地方,可引申为仓库栈(类似好多的计算机系统中的概念)是计算机科学工作者抽象出来的概念(客观世界中只有内存这个东西),所谓科学,其实是从认识和实践客观事物中抽象出一定规律,并在这个规律中进行演绎,最后反过来指导认识和实践客观事物的过程。
1.1 数据结构中的栈
1.2 代码的运行方式
1.3 内存区域
2. 队列
3. 数据类型
JS 中有七种基本数据类型
{} [] /^$/ new Date() Math
4. 执行上下文
4.1 如何存储
4.2 如何复制
4.2.1 基本数据
4.2.2 引用数据
5. 多个执行上下文栈
5.1 执行上下文分类
5.2 多个执行上下文
6. 执行上下文生命周期
6.1 生命周期有两个阶段
this
指向6.2 变量对象
function
进行的函数声明,函数名为变量对象的属性名,值为函数对象,如果属性已经存在,值会用新值覆盖var
关键字进行的变量声明,每找到一个变量声明,就会在变量对象上建一个属性,值为undefined
, 如果变量名已经存在,则会跳过,并不会修改原属性值,let
声明的变量并不会在此阶段进行处理var
变量并不会覆盖函数。执行阶段重新赋值可以改变原有的值6.2.1 基本类型
6.2.2 变量提升
6.2.3 激活对象
VO -> AO
this
指针6.2.4 全局上下文的变量对象
window
window
, 而且这个变量对象不能激活变成活动对象7. 作用域
7.1 作用域
7.2 作用域链
7.2.1 例 1
7.2.2 例 2
scopeChain
其实是在创建函数的时候确定的8. 闭包
foo
, 它包含了一个函数fn
,这个函数fn1
可以调用被这个作用域所封闭的变量a
、函数等内容8.1 闭包
Call Stack
为当前的函数调用栈Scope
为当前正在被执行函数的作用域链Local
为当前的活动对象关于
Scope
旗下的Script
测试:Closure
是特殊的,它旗下的值是可以被保存下来的,相当于在two
的作用链途中留下了版本记录或者说痕迹8.2 闭包优化
8.3 arguments
9. var 和 let
{ }
包括,if
语句和for
语句里面的{ }
也属于块作用域9.1 ES5 问题
9.1.1 全局变量
9.1.2 内层变量可能会覆盖外层变量
9.2 let
9.3 var&let&const
let
会在编译阶段报错9.3.1 暂时性死区
9.3.2 全局变量
let、const、import、class
再加上 ES5 的var、function
共有六种声明变量的方式var、function
声明的全局变量,依然是顶层对象的属性;let、const、class
声明的全局变量不属于顶层对象的属性9.3.3 题目
非严格模式:
10. this
10.0 全局对象
10.1 用点调用
this
就是谁10.2 直接调用
.
,this 就是 window(严格模式下是 undefined), 自执行函数中的 this 一般都是 window10.3 绑定事件
10.4 箭头函数
10.5 构造函数
10.6 call/apply/bind
11. 面向对象
11.1 原型链
11.1.1 一切皆对象
typeof function='function'
11.1.1.1 typeof
typeof
返回的都是字符串null {} [] /&$/ Date => object
11.1.2 函数
Object
11.1.3 隐式原型
11.1.3.1 proto
__proto__
属性,指向创建该对象的函数的prototype
Object.prototype.__proto__
指向的是null
11.1.3.2 自定义函数的 prototype
prototype
的__proto__
指向的就是Object.prototype
11.1.3.3 自定义函数
Foo.__proto__
指向Function.prototype
Function
的prototype
和__proto__
都指向Function.prototype
11.1.4 instanceof
__proto__
这条链来向上查找,如果能找到函数的prototype
则返回 true, 否则返回 false11.2 批量创建对象
new
来调用一个函数,这个函数就成为了构造函数,构造函数里可以对实例对象的私有属性赋值prototype
属性,此原型对象上存放所有实例的公有方法模拟
new
的操作:11.3 继承
11.3.6 原型链面试题
11.3.7 异步面试题
12. ES6
12.1 词法环境
12.2 静态作用域
12.3 闭包
★了解更多
➹:栈究竟在哪里? - FanMo 的回答 - 知乎
➹:TypeScript: 游乐场 - 一个用于 TypeScript 和 JavaScript 的在线编辑器
➹:04-复习上节课的作业题「详细讲解:VO、AO、GO 以及一些其它细节知识点」 - zf-fe
➹:闭包 - JavaScript - MDN
➹:JavaScript Scope and Closures | CSS-Tricks
➹:backbone.js - Chrome javascript tools: Global, Closure and Local Scope - Stack Overflow
➹:function - How do JavaScript closures work? - Stack Overflow
The text was updated successfully, but these errors were encountered: