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