|
@@ -237,9 +237,41 @@ console.log(b);
|
|
|
### 环境变量和记录
|
|
### 环境变量和记录
|
|
|
|
|
|
|
|
每一个执行上下文会关联到一个环境变量(Variable Environment)中,在执行代码中变量和函数的声明会作为环境记录(Environment Record)添加到变量环境中
|
|
每一个执行上下文会关联到一个环境变量(Variable Environment)中,在执行代码中变量和函数的声明会作为环境记录(Environment Record)添加到变量环境中
|
|
|
|
|
+
|
|
|
对于函数来说,参数也会被作为环境记录添加到变量环境中
|
|
对于函数来说,参数也会被作为环境记录添加到变量环境中
|
|
|
所以对于上面的解释来说,**将不再是VO(变量环境),而是环境记录(VariableEnvironment)**,也就是说不一定是`O(object)`,只要是记录都行(map或者其他可以记录的类型)
|
|
所以对于上面的解释来说,**将不再是VO(变量环境),而是环境记录(VariableEnvironment)**,也就是说不一定是`O(object)`,只要是记录都行(map或者其他可以记录的类型)
|
|
|
|
|
|
|
|
|
|
+```js
|
|
|
|
|
+function foo() {
|
|
|
|
|
+ console.log(n) // 输出 undefined
|
|
|
|
|
+ var n = 200
|
|
|
|
|
+ console.log(n) // 输出 200
|
|
|
|
|
+}
|
|
|
|
|
+var n = 100;
|
|
|
|
|
+console.log(n)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+针对上面的测试用例,第二个输出为 200 应该很好理解,第一个输出为什么是 `undefined` 呢?
|
|
|
|
|
+
|
|
|
|
|
+因为函数 foo 本身也有有一个函数作用域 `FEC`,与全局作用域变量初始化一样,先给定义每个变量,再根据执行顺序给各个变量赋值,由于函数 `foo` 内定义的变量 `n`,所依此时函数作用域内会定义变量 `n` 并赋值为 `undefined` (这个 n 与全局变量中的 n 不是同一个)
|
|
|
|
|
+
|
|
|
|
|
+那么当第一个 `console.log(n)` 执行的时候 n 并未赋值,所以会输出 `undefined`
|
|
|
|
|
+
|
|
|
|
|
+```js
|
|
|
|
|
+var a = 100
|
|
|
|
|
+function foo() {
|
|
|
|
|
+ console.log(a) // 输出 undefined
|
|
|
|
|
+ return
|
|
|
|
|
+ var a = 100
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+foo()
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+这个输出 `undefined` 与上面的案例同理,虽然这次 `foo` 函数中的变量 a 定义在 `return` 之后,是永远不会被执行的,但是代码在解析阶段是不会执行的,也就是不知道会被 `return` 掉,所以在 `foo` 的作用域内依旧初始化了变量 a 并且赋初值为 `undefined`
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
## 内存管理
|
|
## 内存管理
|
|
|
|
|
|
|
|
不管什么语言,在代码执行的过程中都需要分配内存,不同的是某些语言需要手动管理内存,某些编程语言可以帮助管理内存
|
|
不管什么语言,在代码执行的过程中都需要分配内存,不同的是某些语言需要手动管理内存,某些编程语言可以帮助管理内存
|
|
@@ -250,8 +282,8 @@ console.log(b);
|
|
|
3. 不需要使用时,释放内存
|
|
3. 不需要使用时,释放内存
|
|
|
|
|
|
|
|
- JavaScript会在定义变量时为我们分配内存
|
|
- JavaScript会在定义变量时为我们分配内存
|
|
|
- - JS对于基本数据类型内存的分配会在执行时,直接在栈空间进行分配
|
|
|
|
|
- - JS对于复杂数据类型内存的分配会在堆内存中开辟空间,并在将这块空间的指针返回值变量引用
|
|
|
|
|
|
|
+ - JS对于**基本数据类型**内存的分配会在执行时,直接在**栈空间**进行分配
|
|
|
|
|
+ - JS对于**复杂数据类型**内存的分配会在**堆内存**中开辟空间,并在将这块空间的指针返回值变量引用
|
|
|
|
|
|
|
|
因为**内存是有限**的,所以当**内存不再需要的时候**,我们需要**对其进行释放**,以便腾出**更多的内存空间**
|
|
因为**内存是有限**的,所以当**内存不再需要的时候**,我们需要**对其进行释放**,以便腾出**更多的内存空间**
|
|
|
再手动管理内存的语言中,我们需要通过一些方式来释放不再需要的内存,比如free函数:
|
|
再手动管理内存的语言中,我们需要通过一些方式来释放不再需要的内存,比如free函数:
|
|
@@ -320,15 +352,17 @@ fn();
|
|
|
|
|
|
|
|

|
|

|
|
|
|
|
|
|
|
-## JS函数式编程(编程范式、规范方式)
|
|
|
|
|
|
|
+### JS 函数的 this 指向
|
|
|
|
|
|
|
|
-函数第一公民 可以作为形式参数和返回值
|
|
|
|
|
|
|
+在常见的编程语言中,this 通常只出现在类的方法中,但是在 javascript 更加灵活
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-### apply、call、bind
|
|
|
|
|
|
|
+## JS函数式编程(编程范式、规范方式)
|
|
|
|
|
|
|
|
|
|
+函数第一公民 可以作为形式参数和返回值
|
|
|
|
|
|
|
|
|
|
+### apply、call、bind
|
|
|
|
|
|
|
|
### JS纯函数(pure funtion)
|
|
### JS纯函数(pure funtion)
|
|
|
|
|
|