Prechádzať zdrojové kódy

feat: 添加一些GOAO的例子

usuifohe 2 rokov pred
rodič
commit
470d05ab39
1 zmenil súbory, kde vykonal 39 pridanie a 5 odobranie
  1. 39 5
      TS/JaveScript.md

+ 39 - 5
TS/JaveScript.md

@@ -237,9 +237,41 @@ console.log(b);
 ### 环境变量和记录
 
 每一个执行上下文会关联到一个环境变量(Variable Environment)中,在执行代码中变量和函数的声明会作为环境记录(Environment Record)添加到变量环境中  
+
 对于函数来说,参数也会被作为环境记录添加到变量环境中  
 所以对于上面的解释来说,**将不再是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. 不需要使用时,释放内存
 
 - JavaScript会在定义变量时为我们分配内存
-  - JS对于基本数据类型内存的分配会在执行时,直接在栈空间进行分配
-  - JS对于复杂数据类型内存的分配会在堆内存中开辟空间,并在将这块空间的指针返回值变量引用
+  - JS对于**基本数据类型**内存的分配会在执行时,直接在**栈空间**进行分配
+  - JS对于**复杂数据类型**内存的分配会在**堆内存**中开辟空间,并在将这块空间的指针返回值变量引用
 
 因为**内存是有限**的,所以当**内存不再需要的时候**,我们需要**对其进行释放**,以便腾出**更多的内存空间**  
 再手动管理内存的语言中,我们需要通过一些方式来释放不再需要的内存,比如free函数:  
@@ -320,15 +352,17 @@ fn();
 
 ![代码的内存解析](./Image/7.png)
 
-## JS函数式编程(编程范式、规范方式)
+### JS 函数的 this 指向
 
-函数第一公民 可以作为形式参数和返回值
+在常见的编程语言中,this 通常只出现在类的方法中,但是在 javascript 更加灵活
 
 
 
-### apply、call、bind
+## JS函数式编程(编程范式、规范方式)
 
+函数第一公民 可以作为形式参数和返回值
 
+### apply、call、bind
 
 ### JS纯函数(pure funtion)