学习前端的第二十二天——预解析

今天学习了函数返回值return、作用域以及预解析,发现预解析这一块还是有丶深奥的。



一、return函数返回值

  • 规则介绍:
    1、这个返回值是function函数默认自带的,可以使用也可以不使用
    2、用于外界和函数内部进行沟通的一个"桥梁"
    3、函数内部可以访问函数外部的东西
    4、函数外部是访问不了函数内部的,这是函数的规则 — 作用域
    5、函数这种规则的作用是为了防止数据相互间覆盖和命名污染问题

  • return使用:
    1、可以让外部的访问函数内部的数据,外部可以通过函数名加括号的形式接收 fn();
    2、当函数没有返回值的时候,外界接收到的就是undefined
    3、return可以终止函数的执行,return后面的代码不会执行
    4、函数的返回值可以返回任意数据类型
    5、注意:外界拿到的是return后面的数据 return 数据 == 函数名()



二、作用域

  • 域,表示的就是范围,区域。例如:两个国家之间有边界线
  • 作用域和函数以及变量有关系
  • 函数作用域分为全局作用域和局部作用域
    1、全局作用域,一个变量在整个script(js文件)标记里面都可以使用,函数外部能使用
    2、局部作用域,只能在函数内部使用
  • 变量作用域,分为全局和局部
    1、在函数外部声明的变量称之为全局变量
    2、在函数内部声明的变量称之为局部变量

声明变量问题:

  • js语言要求我们声明变量时必须使用var关键字
  • js里面如果不使用var声明变量,直接写的变量其实也可以使用,把这种问题称之为bug
  • 注意:在函数内部声明的变量如果没有使用var关键字,这个变量就属于全局变量

作用域链:

  • 作用域链是作用域访问的规则,规定了如何去查找或者叫做访问一些其他域里面的数据
  • 作用域链把作用域划分成了几个不同的 ‘等级
  • 把全局作用域称之为最高的等级,专业术语叫做0级作用域,把函数内部的作用域称之为1级作用域
  • 如果遇到函数嵌套函数的情况,外层的函数是1级作用域,其他函数以此类推,分别是2级、3级…
  • 作用域链其实就是把所有的作用域链接了起来,方便彼此之间进行访问
  • 访问规则:
    1、访问数据时先在自己的作用域查找如果有就直接使用,如果没有就上一级继续查找,有就使用上一级
    2、如果上一级没有就需要往上查找,直到找到0级作用域还是没有就报错

变量的生命周期:

  • JavaScript 变量生命周期在它声明时初始化
  • 局部变量在函数执行完毕后销毁
  • 全局变量在页面关闭后销毁


三、预解析

  • 浏览器不会直接执行代码,当js引擎执行代码时,会分为两部分,预解析和逐行执行
  • 预解析就是浏览器加工处理代码的过程
  • 预解析规则:
    1、变量和函数声明提升,代码执行会把声明提升到当前作用域的最顶端
    2、按着代码原先顺序,逐行执行代码
    3、把一个函数赋值给变量(var声明的), 函数声明不会提升
简单的小练习

var a = 3; 
function fn(){
    
        
    var b = 4;    
    alert(a);      
    alert(b);      
    function me(){
    
            
        alert(b);    
    }    
     me(); 
} 
fn(); 
alert(a);

/*
    0级作用域预解析:
    var a;
    function fn(){    
        var b = 4;    
        alert(a);      
        alert(b);      
        function me(){        
            alert(b);    
        }    
     me(); 
    } 
    a = 3;
    fn(); 
    alert(a);

    1级作用域预解析:
    var a;
    function fn(){    
        var b;
        function me(){        
            alert(b);    
        }
        b = 4;
        alert(a);   //3   
        alert(b);   //4
        me();      //4
    } 
    a = 3;
    fn(); 
    alert(a); //3
*/


四、JS的编译和执行

  1. 先检查语法错误——语法错误,当前代码不执行
  2. 声明提升——变量提升和函数提升,作用域所有使用var声明的变量和非匿名函数
  3. 开始编译——逐行执行

猜你喜欢

转载自blog.csdn.net/Robergean/article/details/118054837
今日推荐