预解释

1.当浏览器加载HTML页面的时候,首先会提供一个全局JS代码执行的环境 -->全局作用域(后台:global/ 前端:Windows)

var num = 12;
var obj = {name: "小明", age: 7};
function fn() {
    console.log("你好啊!!!");
}
console.log(fn); // -->把整个函数的定义部分(函数本身)在控制台输出
console.log(fu()); //-->把当前函数执行的返回结果(return 后面是什么,返回什么,如果没有 return,默认值是undefined) 在控制台输出

2.预解释

- 在当前的作用域中,JS代码执行之前,浏览器首先会默认的把所用代 `var` 和 `function` 的进行提前的声明或者定义

- 理解声明和定义
    - ` var num = 12;`
    - 声明(declare):`var num;` -->告诉浏览器在全局作用域中有一个 `num` 的变量了
    - 定义(defined):`num = 12;` -->给我们的变量赋值

- 对于带 `var` 和 `function` 关键字的在预解释的时候还是不一样的

    - `var` --> 在预解释的时候只是提前的声明
    - `function` --> 在预解释的时候提前声明 + 定义都完成了

- 预解释只发生在当前的作用域下,例如:开始只对 我 `windows` 下的进行预解释, 函数只有执行的时候才会形成一个新的私有的作用域(新的堆内存),之后在对函数中的变量进行预解释

console.log(num);//-->undefined
      var num = 12;
      console.log(num);//-->12

      var obj = {name: "小明", age: 7};

      fn(100,200);// -->可以执行,因为在预解释的时候就声明 + 定义了
      // console.log(total);  这个将会报错,因为函数中的预解释是在私有作用域中进行的
      function fn(num1,num2) {
          var total = num1 + num2;
          console.log(total);
      }

3.JS中内存的分类

- **栈内存**:用来提供JS代码执行的环境  --->作用域(全局作用域/私有作用域)
- **堆内存**:用来存储引用数据类型的值 --->对象存储的是属性名和属性值,函数存储的是函数本身(以字符串形式)

                                                                                                                    2019-04-03  

原文地址:https://www.cnblogs.com/nie5135257/p/10651993.html