1.预解释和作用域链

预解释

js数据类型
基本数据类型
  number
  string
  boolean
  null
  undefined
引用数据类型
  object:{},[]、/……$/,Date
  function

基本数据类型和引用数据类型的区别
  基本数据类型是按照值来操作的,引用数据类型是按照引用地址来操作的
 var num =12;

 var obj = {name:'hulongfei',age:27};

  function fn(){
      console.log(this is sunday!);
   }

  console.log(fn); //把整体函数打印出来
  console.log(fn()); //把当前函数执行的结果return后面的值输出出来,不写默认返回undefined
1.当浏览器加载html页面的时候,首先会提供一个供全局js代码执行的环境 -> ‘全局作用域(global/window)’
2.预解释(变量提升):
    在当前的作用域中,js代码执行之前,浏览器首先会把所有带var和function的进行提前的声明或者定义
    1):理解声明和定义
          var num =12;
          声明(declare):var num; 告诉浏览器在全局作用域中有一个num变量
              如果一个变量只是声明了但是没有赋值,默认的值是undefined
          定义(defined): num =12; 给我们的变量进行赋值

    2):对于带var和function关键字的在预解析的时候操作还是不一样的
         var -> 在预解析的时候只是提前声明
         function -> 在预解析的时候提前的声明+定义都完成了

    3):预解释只发生在当前的作用域下,例如:开始只对window下的进行预解释,只有函数执行的时候才会对函数中的进行预解释

 3.js中内存的分类
       栈内存:用来提供一个供js代码执行的环境 ->作用域(全局作用域/私有作用域)
       堆内存:用来存储引用数据类型的值、对象存储的时候属性名和属性值,函数存储的时候代码字符串

作用域链

console.log(total); //undefined
 var total = 0;
 function fn(num1,num2){
     console.log(total);
     var total = num1 + num2;
     console.log(total);
 }
fn(100,200); //函数的功能和结果区分开,函数执行输出0,300, 结果返回undefiend
console.log(total); //0 外部访问的是外部的变量0
1.如何区分私有的和全局的变量?
    1):在全局作用域下声明的变量是全局变量
    2):在'私有作用域中声明的变量'和'函数的形参'都是私有的变量
        在私有作用域中,我们代码执行的时候遇到一个变量,首先我们要确定它是否为私有的变量,
        如果是私有的变量,那么和外面的任何东西都没有关系;如果不是私有的,则往当前作用域的上级作用域进行查找,
   如果上级作用域也没有则继续查找,一直找到window为止,这个过程叫 -> ‘作用域链’

2.当函数执行的时候(直接目的:让函数体中的代码执行),首先会形成一个新的私有作用域,然后按照以下步骤执行:
   1):如果有形参先给形参赋值
   2):进行私有作用域的预解释
   3):私有作用域的代码从上到下执行

3.闭包只是一种'机制'
   函数形成一个新的私有作用域保护了里面的私有变量不受外界干扰,(外面的修改不了私有的,私有的也改变不了外面的) -> '闭包'
console.log(total); //undefined
 var total = 0;
 function fn(num1,num2){
     console.log(total); 
     total = num1 + num2;
     console.log(total); 
 }
fn(100,200); //0 300
console.log(total); //300

你可能感兴趣的:(1.预解释和作用域链)