定义:JavaScript”预解析”,可以理解为把变量或函数预先解析到它们被使用的环境中。

通俗点讲,即认为浏览器在正式运行JavaScript代码前,

第一步,会预先根据关键字var、function等,来查找一些需要被解析的东西,

例如:var a = 1; function test(){ alert(2); };

第二步,给这些需要被解析的东西提前赋值,其中包括:

⑴ 所有的变量,提前赋值:undefined;

⑵ 所有的函数,在正式运行代码前,都赋值为整个函数块。

第三部,“预解析”结束后,浏览器再逐行解读代码,并通过表达式:= + - * -- ++ !等来修改这些“预解析”的值。

二、解析原则

1. JavaScript “预解析”过程中,遇到重名的内容,只保留一个:

⑴ 重名变量或重名函数,保留最后的一个;
⑵ 变量和函数重名,只保留函数;

2. 根据作用域链,来查找上文第一步中提到的需要被解析的东西

查找原则:从上到下,从里到外

即先找局部作用域里找,然后子对象会一级一级向上寻找所有父对象的变量。

案例:

  1. alert(a); // function a(){alert(4);}
  2. var a=1;
  3. alert(a); // 1
  4. function a(){alert(2);}
  5. alert(a); // 1
  6. var a=3;
  7. alert(a); // 3
  8. function a(){alert(4);}
  9. alert(a); // 3
1、每个var、funciton都会被预解析,var被预解析为undefined,function被预解析为它本身(不过是以字符串形式)
2、这里面有两个function a,只保留最后一个,即第二个function a(){alert(4);}
3、这里面有一个变量a,名字和function重合了。变量与函数重名,只保留函数。所以第一个变量a最后被预解析为 function a(){alert(4);}

JavaScript预解析的更多相关文章

  1. JavaScript 预解析机制

    首先我们来看一段代码: <script> console.log(a); var a = 10; </script> 此时运行结果为   为什么会显示undefined呢?这就 ...

  2. javascript预解析和作用域

    JavaScript解析过程分为两个阶段: 一是:编译阶段.就是JavaScrip预解析阶段,在这个阶段JavaScript解析器将完成把JavaScript脚本代码转换到字节码; 二是:执行阶段.在 ...

  3. Javascript预解析、作用域、作用域链

    最近在看js的一些资料,总结一下昨晚看到的js作用域方面的知识,不准确的地方希望留言指正! 先看片段js代码如下: < script type="text/javascript&quo ...

  4. javascript 预解析

    内容来源:http://www.cnblogs.com/TomXu/archive/2011/12/28/2286877.html JavaScript中,你可以在函数的任何位置声明多个var语句,并 ...

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

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

  6. JavaScript预解析1

    var 不一定是用来定义局部变量的 jscript的全局变量和局部变量的分界是这样的:                  过程体(包括方法function,对象Object o ={})外的所有变量不 ...

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

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

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

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

  9. 第112天:javascript中函数预解析和执行阶段

    关于javascript中的函数:  1.预解析:把所有的函数定义提前,所有的变量声明提前,变量的赋值不提前  2.执行 :从上到下执行,但有例外(setTimeout,setInterval,aja ...

随机推荐

  1. CSS position属性 标签: css 2016-09-06 15:58 78人阅读 评论(0) 收藏

    踩了position的坑,主要是因为对position属性理解不深. 以下是w3school中对position的解释: 可能的值 值 描述 absolute 生成绝对定位的元素,相对于 static ...

  2. TC9.0新增实用接口,用AutoHotkey获取当前选中文件等信息

    TC9.0的history.txt里有几行更新说明(见文章末尾),可以用SendMessage命令获取信息, 消息号是WM_USER+50(即1074),wParam则是更新说明里的内容, 下面是我简 ...

  3. 设置C++ cout输出精度

    cout.precision(5); 数字表示小数点位数 // modify precision #include <iostream> // std::cout, std::ios in ...

  4. Mac iTerm2使用总结

    1.快捷键大全新建标签:command + t关闭标签:command + w切换标签:command + 数字 command + 左右方向键切换全屏:command + enter查找:comma ...

  5. JavaScript小游戏--翻牌记忆游戏

    翻牌记忆游戏源码 1.有8张图片,每张图片要放两次,生成如下数组,长为16,[0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7] 其中两两相同的代表两张相同的图片,0对应文件夹image ...

  6. 调节Ubuntu分辨率

    列出当前支持的分辨率 使用 xrandr 命令新增显示模式 至此分辨率更改完成 重启后会失效 在 ~/.profile 最末尾添加修改分辨率的命令

  7. Mybatis 和Spring整合之原始dao开发

    F:\Aziliao\mybatis\代码\31.mybatis与spring整合-开发原始dao 1.1. SqlMapConfig.xml <?xml version="1.0&q ...

  8. sort论文和代码解读

    流程:1.detections和trackers用匈牙利算法进行匹配 2.把匹配中iou < 0.3的过滤成没匹配上的(1.2步共同返回匹配上的,没匹配上的trackers,没匹配上的detec ...

  9. ListView 中嵌套 GridView

    1.主布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andr ...

  10. IBAction作用相当于void,NSLog(@"被调用的方法名是%s",__func__);

    IBAction作用相当于void,NSLog(@"被调用的方法名是%s",__func__);