js预编译

    xiaoxiao2022-07-16  173

    <!DOCTYPE html> <html lang="zh-cmn-Hans"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <link rel="stylesheet" href="../public/css/bootstrap.min.css"> <title>Document</title> <script> console.log(window.c); console.log(window.f); c = function (c) { console.log(c); //f没有经过var修饰,升级为全局变量,同时需要window前缀进行访问 var c = f = 100; //function c(){} console.log("全局以变量赋值形式声明的函数" + c); } console.log(window.c); c(88); console.log(window.f); </script> </head> <body> </body> </html>

    js语法分析【 var 变量=】 这种正则  解析为赋值 可以直接采用变量名访问 创建GO或AO对象 都是赋值undefined

    【 变量=】正则,范围升级为GO,即使在函数内部,赋值为undefined,访问需要采用window前缀。

    //伪代码 GO/window = { //页面加载创建GO同时,创建了document、navigator、screen等等属性,没用采用var前缀的都需要使用属性方式访问,不然出现   //未定义错误,如果严格执行,这种不用var的根本不会通过。【变量=函数体】等同以上正则 c: undefined, f: undefined }-------------------------

    第二步:将实参映射到形参

    -------------------------

    第三步:函数体表达式作为值对以上形成的key-value进行同名覆盖

    如上没有同名函数在GO阶段省略

    ------------------------

    第四步:逐行执行表达式。

    以上从上往下执行,

    当到

    c(88)时,进行AO创建,同样是以上四步,主要是在映射实参时比GO阶段多了一步。

    执行结果:

    undefined undefined function c() 88 全局以变量赋值形式声明的函数100 100

    以上主要在var a 在函数内部声明与形参形成同名关联造成值同步。

    参考文章:

    http://www.pianshen.com/article/200070261/

    最新回复(0)