• js 预解析


    js预解析

    1. 定义

    预解析:在当前作用域下,js运行之前,会把带有var和function关键字的事先声明,并在内存中安排好。然后再从上到下执行js语句。

    预解析只会发生在通过var定义的变量和function上。

    2. var

    通过var关键字定义的变量进行预解析的时候:都是声明declare,不管它有没有赋值,都会赋值undefined。

    alert(a); //undefined
    var a = 1;
    alert(b); //undefined
    var b = function(){
    }
    alert(c); //undefined
    var c;
    只要是通过var定义的,不管是变量,还是函数,都是先赋值undefined,如果是变量,也不管变量有没有赋值,在预解析阶段,都是会被赋值为undefined。

    3. function

    function进行预解析的时候,不仅是声明而且还定义(define)了,但是它存储的数据的那个空间里面存储的是代码是字符串,没有任何意义。

    alert(a); //弹出的是下面的function
    function a(){
      alert("预解析function")
    }
    注意这种情况

    定义一个函数想要立即执行,写成如下形式是不可行的,在预解释的时候,它把它分解成两部分来对待,第一部分是fn函数,而第二部分是(),一个匿名函数,执行时会报错。如果小括号带参数,如(2),虽然不会报错,会打印出来2,但并不能把fn执行,也不能当成参数传递给fn函数。

    function fn(){
    //代码区
    }()
    如果你想实现立即执行的函数,可以把要执行的函数放到一对括号里面,对于JavaScript 来说,括弧()里面不能包含语句,所以在这一点上,解析器在解析function关键字的时候,会将相应的代码解析成function表达式,而不是function声明所以,只要将大括号将代码(包括函数部分和在后面加上一对大括号)全部括起来就可以了。 如下:

    (function fn(){
    //代码区...
    }())
    还可以写成:闭包。

    (function(){
    //代码区...
    })();


    4. 预解析需要注意的情况

    预解析是发生在当前作用域下的,刚开始的时候,我们预解析的是全局作用域,在js中我们的global就是我们的window。
    我们运行函数的时候会生成一个新的私有作用域(每次执行都是新的,执行完成就销毁)这个作用域下我们可以理解为开辟了一个新的内存空间。在这个内存中我们也要执行预解析。当我们的函数执行完成后,这个内存或者作用域就会销毁
    如果在当前作用域下的一个变量没有预解析,就会向它的上一级去找,直到找到window,如果window下也没有定义,就会报错。所以,在函数内通过var定义的变量是局部变量,没有能过var 定义的变量是全局变量。
    预解析不会在同一个变量上重复的发生,也就是一个变量如果已经在当前作用域下预解析了,不会再重复解析。
    等号右边的function不会进行预解析。
    alert(a);
    fn();
    var a = function fn(){};
    第一次打印undefined,第二次报错,未定义,因为预解析的时候,=号右边是不进行预解析的。

    预解释是不受其它if或者其它判断条件影响的,也就是说,即使条件不成立,我们里面只要有var或者function也会被预解释。if,while
    alert(a); //undefined
    if(1==2){
      var a=12;
    }
    后面定义的会覆盖前面定义的
    alert(a); //弹出后面的function
    function a(){
    var b;
    }
    alert(a); //仍然弹出后面的function,因为function是提前预解析的
    function a(){
    var c;
    }
    JavaScript“预解析”是分段进行的,准确说是分<script>块进行的。

    5. var声明的变量和function声明的函数在预解析的区别

    var声明的变量和function声明的函数在预解析的时候有区别,var声明的变量在预解析的时候只是提前的声明,function声明的函数在预解析的时候会提前声明并且会同时定义。也就是说var声明的变量和function声明的函数的区别是在声明的同时有没同时进行定义。

    6. 预解析只发生在当前的作用域下

    程序最开始的时候,只对window下的变量和函数进行预解析,只有函数执行的时候才会对函数中的变量很函数进行预解析。

  • 相关阅读:
    判断数组的方法
    介绍下 npm 模块安装机制,为什么输入 npm install 就可以自动安装对应的模块?
    因为这样那样的原因又滚回来了
    AFO成功
    SDOI2018
    TJOI2018
    杂题
    线段树合并
    几个dp的陈年老题
    【自家测试】2018-5-9
  • 原文地址:https://www.cnblogs.com/szl6/p/9995023.html
Copyright © 2020-2023  润新知