JS中的 变量提升、作用域、闭包 核心原理解读

作者:日期:2017-11-24 14:04:37 点击:57

 

数据类型的操作原理

基本数据类型

1.var a=12;
2.var b=a;
3.b=13;
4.console.log(a); //=>12

直接在当前作用域中创建了基本数据类型的值(或者说基本类型值直接存储在当前作用域中),然后把这个值和变量关联起来(一个变量只能关联一个值,关联下一个值后和之前关联的值就没关系了),我们把关联这个操作叫做 变量赋值,基本数据类型是直接 按值操作

引用数据类型

1.var o={name:'珠峰培训'};
2.var p=o;
3.p.name='中国最权威的前端培训机构';
4.console.log(o.name);

引用数据类型不是直接按值操作的(它的结构复杂,要存储很多值,无法直接的创建值),在JS中遇到引用数据类型(对象或者函数),按照如下操作进行:

1、首先开辟一个新的内存空间(浏览器为其分配一个16进制的地址) 
2、把需要存储的内容存储到内存空间中

  • 对象是把键值对依次存储到空间中
  • 函数是把函数体中的代码当做 ‘字符串’ 存储到内存中

3、把空间的地址赋值给对应的变量,所以我们也说:引用数据类型是按照空间的引用地址操作

1.function fn(){
2. var total=null;
3. total=1+1;
4. return total;
5.}
6.fn();
7.fn();
8....

函数执行的时候也有属于自己的一系列操作 
1、函数执行首先会形成一个新的私有作用域,目的是为函数体中的代码提供一个执行的环境(而且这个环境是私有的) 
2、把创建时候存储的代码字符串copy一份到自己的私有作用域中,然后把字符串转换为JS表达式,再然后依次自上而下执行

[总结] 
每一次执行函数都是形成一个新的私有作用域,然后把代码重新自上而下执行(一切都从新开始),所以多次执行函数之间是没有直接联系的,互不干扰;

函数执行形成的私有作用域,保护了里面的私有变量不受外界的干扰,我们把函数执行的这种保护机制叫做 闭包(如果当前变量是私有的,那么在函数体中出现的所有这个变量都和外界没有任何关系)

全局作用域

浏览器渲染页面(渲染页面中的JS)的时候,会提供一个供代码执行的环境 =>全局作用域(window/global)

 

上一篇: 模板引擎

下一篇: JavaScript常用的操作语句