zoukankan      html  css  js  c++  java
  • HTML学习 JavaScript 预解析

    1. 预解析

    JavaScript代码是由浏览器来执行的。JavaScript解析器在运行js代码时分为两步:预解析和执行代码。

    代码示例:

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>预解析</title>
        <script>
            // 1问 num is not defined
            // console.log(num);
            // 2问 预解析提升了变量声明 但是不提升赋值操作 undefined
            // 所以代码执行顺序为 var num; console.log(num); num = 10; 所以输出为undefined
            console.log(num);
            var num = 10;
            // 3问 可以调用
            fn();//已经把函数声明提升到最前面了
            function fn() {
                console.log(11);
            }
            //4问
            //放在上面报错 所以采用函数表达式声明函数调用必须放在后面
            //执行顺序 var fun; fun(); fun赋值操作
            fun();
            var fun = function() {
                console.log(22);
            }
            //可以调用
            fun();
            //我们JS引擎运行js分为两步 预解析 和 代码执行
            //1 预解析 js引擎会把js里面所有的var 还有 function 提升到当前作用域的最前面
            //2 代码执行 按照代码书写的顺序 从上往下执行
            // 预解析还分为 变量预解析(变量提升) 和 函数预解析(函数提升)
            //变量预解析 就是把所有的变量声明提升到当前作用域的最前面 不提升赋值操作。
            //函数提升 就是把所有的函数声明提升到当前作用域的最前面 但是不调用
        </script>
    </head>

    面试案例

    //请问输出什么
    var num = 10;
    fun();
    function fun() {
        console.log(num);
        var num = 20;
    }
    
    //预编译后的代码顺序为
    var num;
    function fun() {
        var num;
        console.log(num);
        num = 20;
    }
    num = 10;
    fun();
    //所以输出的是 undefined

    面试案例二:

    //下面输出什么
    //注意 在函数内部 没有声明的直接赋值的变量也是全局变量
    function f1() {
        //相当于 var a = 9; b = 9; c = 9
        var a = b = c = 9;
        console.log(a);
        console.log(b);
        console.log(c);
    }
    f1();
    console.log(c);
    console.log(b);
    console.log(a);
    //预解析后
    function f1() {
        var a;
        a = 9;
        b = 9;
        c = 9;
        console.log(a);// 9
        console.log(b);// 9
        console.log(c);// 9
    }
    f1()
    console.log(c);// 9
    console.log(b);// 9
    console.log(a);// a is not defined
  • 相关阅读:
    写在读ng之前的基础知识----笔记
    angularJS中-$route路由-$http(ajax)的使用
    angular学习-入门基础
    grunt使用watch和livereload的Gruntfile.js的配置
    jQuery1.4源码解读
    Handlebars的使用方法文档整理(Handlebars.js)
    zepto源代码解读
    CentOS 安装rz和sz命令
    Linux下*.tar.gz文件解压缩命令
    Linux下用rm删除的文件的恢复方法
  • 原文地址:https://www.cnblogs.com/huanying2000/p/12384239.html
Copyright © 2011-2022 走看看