JS的预解析过程:

1,预解析

2,再逐行解读代码,

实例:

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

<script>
        var name="xm";
        var age=18;
        function fn(argument){
            console.log(name);
            var name="xh";
            var age=12;
        }
</script>

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

解析:

全局作用域,局部作用域,都是通过以下两个步骤进行预解析的。

1,先读取有var 的变量(没有使用var的变量是不会被预解析的),给赋值为:undefined。如果两个变量重名,并不影响预解析的过程,就写一个变量就行解析就行(在逐行读取时,只是不同的赋值而已。),如果有函数名和变量重名,那就直接去掉变量,不进行解析。如果函数中存在参数,那么参数也一样使用var进行解析。如:var argument=undefined;

2,再读取function后面的函数---fn,如果有多个函数名重复,那么取最后面一个函数进行声明。

上面实例有两个作用域,一个是window变量对象的全局作用域,一个是fn变量对象的局部作用域。

预解析过程如下:

1,window:

  var name=undefined;

  var age=undefined;

  function fn(argument){
            console.log(name);
            var name="xh";
            var age=12;
        }

2,fn:

  var name=undefined;

  var age=undefined;

  var argument=undefined;

预解析就完成了。然后就是逐行解读代码。

通过逐行解读代码进行赋值,改变变量属性值。如果遇到函数,那么就直接跳过,因为预解析时已经声明过。

所以,上面实例:console.log(name);  输出为: undefined。

实例1:

<script>
        console.log(fn);
        function fn(){}; //预解析:function fn(){};
</script>

输出结果:function fn(){};

实例2:

<script>
        console.log(fn);
  var fn=function(){}; //预解析:var fn=undefined;
</script>


输出结果:undefined 未定义。

实例3:

<script>
        console.log(a);//所以这里a是没有定义,运行就报错。
  a=1;//预解析没有变量。
</script>


输出结果:这里的a没有定义,所以报错,未定义。

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

<script>
        console.log(a); //预解析中只剩下一个函数a,所以这里输出是函数a。
        var a=1; //函数被当成变量赋值为:1。a就是一个变量。
        console.log(a);//所以这里输出为:1。
        function a(){ //两个函数重名只保留最后一个,所以这个函数不进行解析,在逐行解读代码时,没有进行解析的代码也是跳过的。
            console.log(2);
        };
        console.log(a);//函数被当成变量赋值为:1,a就是一个变量。所以这里输出为:1。
        var a=3;  //函数被当成变量赋值为:3。
        console.log(a);//这里输出为:3。
        function a(){ //被预解析的函数就直接跳过不进行解析,因为预解析时,已经声明过了。
            console.log(4);
        };
        console.log(a);//函数被当成变量赋值为:3。所以这里输出为:3。
        a(); //函数被当成变量赋值为:3。所以这里的a为变量,变量不可以当做函数执行。
    </script>

输出结果:

function a(){console.log(4);}

1

1

3

3

报错(a=3,不能当函数执行);

预解析:

//var a=undefined;  变量a与函数 a 重名,所以变量不进行预解析。

//两个函数重名,只对最后一个进行预解析。

function a(){

  console.log(4);

}

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

预解析是一个标签执行完毕并且逐行解读代码完成,才执行第二个标签的预解析和逐行代码解读:

    <script>
        console.log(a);//这个标签预解析后没有变量需要声明,再执行console.log(a); a是没有声明的变量,所以报错。
    </script>
    <script>
        var a=1;
    </script>

输出结果为:报错。第一个标签的a没有声明。

预解析是一个标签执行完毕并且逐行解读代码完成,才执行第二个标签的预解析和逐行代码解读:

    <script>
        var a=1;//预解析:var a=undefined; 再被复制为1。执行完毕,再进行下面一个标签预解析,在逐行解读代码。
    </script>
    <script>
        console.log(a); //所以这里输出为:1。
    </script>

输出结果:1。

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

    <script>
        var a=1; //解析:var a=undefined;
        function fn(a){  //解析:var a=undefined;
            console.log(a); //执行完fn(a)后,输出1。因为这里的a变成全局变量了。重点。
            a=2;
        }
        fn(a);  //这里的a是全局变量,因为局部变量不能再全局中使用,只有全局变量才能在局部中使用。所以这个a=1。
        console.log(a); //局部变量不能再全局中使用,只有全局变量才能在局部中使用。所以这里输出1。
    </script>

输出为:1   , 1

预解析:

window变量对象的属性以及方法:

  var a=undefined;

  fn(a){console.log(a); a=2;};

fn:

var a=undefined   //这里的a 是参数。

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

不要在代码块中声明函数,因为这样有些老的狐火浏览器无法进行正确的预解析。

if(){

  function fn_name(argument){.....body......}

}

for(){

  function fn_name(){.....body......}

}

=================总结=====================

上图:

基本变量复制(这里应该是赋值)时,创建一个副本:

var name="xm";

   name="xh";//基本类型赋值,跟上面一个值无关。即:两个值,在栈内存中开辟了两个位置存放数据。

引用类型赋值的其实是指针:

var xh={sex:"female" age:18};

var xm=xh;//把xh的引用赋值给xm。还是指向同一个堆内存空间,所以两个值和类型都想相等(即同一个引用),即相等。

基本数据类型和引用数据类型传递参数。

两种类型都一样:都是按值传递参数,并不是按引用传递参数。直接值代替参数。

JS预解析机制的更多相关文章

  1. [妙味JS基础]第六课:作用域、JS预解析机制

    知识点总结 浏览器的解析方法 script 全局变量,全局函数 自上而下 函数 由里到外 "JS的解析器": 1)“找一些东西”:var function 参数 var a=未定义 ...

  2. 第06课:作用域、JS预解析机制

    从字面上理解----域就是空间.范围.区域,作用就是读.写,所以作用域我们可以简单理解为:在什么样空间或者范围内对数据进行什么样的读或写操作. 看一下代码 alert(a); // 为什么是undef ...

  3. javascript-初级-day06作用域、JS预解析机制

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  4. JS的解析机制

    JS的解析机制,是JS的又一大重点知识点,在面试题中更经常出现,今天就来唠唠他们的原理.首先呢,我们在我们伟大的浏览器中,有个叫做JS解析器的东西,它专门用来读取JS,执行JS.一般情况是存在作用域就 ...

  5. 轻松搞定javascript变量(闭包,预解析机制,变量在内存的分配 )

    变量:  存储数据的容器     1.声明        var   2.作用域       全局变量. 局部变量. 闭包(相对的全局变量):   3.类型         a.基本类型(undefi ...

  6. 进击JavaScript核心 --- (2)函数和预解析机制

    一.函数 每个函数都是 Function类型的实例,也具有属性和方法.由于函数也是一个对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定 1.函数的定义方式 (1).函数声明 fun ...

  7. 轻松搞定javascript预解析机制(搞定后,一切有关变态面试题都是浮云~~)

    hey,guys!我们一起总结一下JS预解析吧! 首先,我们得搞清楚JS预解析和JS逐行执行的关系.其实它们两并不冲突,一个例子轻松理解它们的关系: 你去酒店吃饭,吃饭前你得看下菜谱,点下菜(JS预解 ...

  8. js预解析相关知识总结以及一些好玩的面试题

    js预解析的题像在做智力题一样有意思~ 预解析 预解析:在解释这行代码之前发生的事情——变量的声明提前了,函数的声明提前 console.log(num) ——未定义Num,结果是报错 var num ...

  9. 从var func=function 和 function func()区别谈Javascript的预解析机制

    var func=function 和 function func()在意义上没有任何不同,但其解释优先级不同:后者会先于同一语句级的其他语句. 即: { var k = xx(); function ...

随机推荐

  1. pwn入门之栈溢出练习

    本文原创作者:W1ngs,本文属i春秋原创奖励计划,未经许可禁止转载!前言:最近在入门pwn的栈溢出,做了一下jarvisoj里的一些ctf pwn题,感觉质量都很不错,难度循序渐进,把自己做题的思路 ...

  2. Javascript高级编程学习笔记(61)—— 事件(5)UI事件

    UI事件 UI事件是指那些不一定与用户操作有关的事件 这些事件在DOM规范出现之前,都是以各种不同的形式存在于不同的浏览器 而在DOM事件中为了保证向后兼容,现有的UI事件如下: DOMActivat ...

  3. Java面试集合(五)

    1. 继承 在Java中的三大特性中存在一种为继承,继承究竟是用来解决什么问题的呢?在我们写代码的时候,我们会在一些类中使用相同的属性和方法,如两个不同的人(类),共同都有年龄,身高,体重等. 那么我 ...

  4. python读取pdf文件

    pdfplumber简介 Pdfplumber是一个可以处理pdf格式信息的库.可以查找关于每个文本字符.矩阵.和行的详细信息,也可以对表格进行提取并进行可视化调试. 文档参考https://gith ...

  5. eos开发(二)使用cleos命令行客户端操作EOS(钱包wallet基础操作)

    不知道下边这一段英文你们是不是能看懂,如果看不懂那就算了,我就是转过来随便看看的. 总之你记住nodeos.cleos和keosd这三个工程十分重要就行了,回头咱们的研究都从这三个工程杀进去. EOS ...

  6. Android中设置控件的背景颜色的方式整理

    版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 在Android开发中,经常需要设置控件的背景颜色或者图片的src颜色. 效果图 代码分析 根据使用的方法不同,划分为 setBackgro ...

  7. 全网最详细的一个超级好用的命令行工具【Cmder】的安装之后的一些配置(图文详解)

    不多说,直接上干货! 1.修改命令提示符λ为$ 首先,我们看到 进入解压后的cmder的目录,进入vendor,打开init.bat文件. 修改第15行的代码 @prompt $E[;;40m$P$S ...

  8. 一套能体现 RBAC 的表结构设计

    1.RBAC 概述 2.表结构设计 2.1.用户表 2.2.角色表 2.3.权限表 2.4.用户角色(关系)表 2.5.角色权限(关系)表 3.总结 1.RBAC 概述 RBAC(Role-Based ...

  9. leetcode — add-binary

    /** * Source : https://oj.leetcode.com/problems/add-binary/ * * * Given two binary strings, return t ...

  10. RabbitMQ系列(二)深入了解RabbitMQ工作原理及简单使用

    深入了解RabbitMQ工作原理及简单使用 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchange介绍 ...