JS解析+预解析相关总结
【js预解析机制】
先来说说js的解析机制吧,浏览器在解析js代码时是从上到下解析的。
解析顺序如:
(1)预解析
找var和function
(2)逐行代码解析
表达式
函数调用
fn1()函数内部再发生
{
(1)预解析
(2)逐行代码解析
}
解析:
由子级到父级寻找变量,称作用域链
如:函数参数,为局部变量
- <script type="text/javascript">
- var a=1;
- function fn1(a){//把a作为参数传进来,但是并没有在他的局部作用域定义
- console.log(a);//函数内预解析为a=undefined
- a=2;//后又将a改为2
- }
- fn1();
- console.log(a);//输出1,在全局中找到的a=1
- </script>
如:
- <script type="text/javascript">
- var a=1;
- function fn1(a){
- console.log(a);//输出1
- a=2;
- }
- fn1(a); //传的参数为var a=1;为局部的
- console.log(a);//输出1,此1为全局var a=1;
- </script>
【js预解析器】通俗的讲就是在浏览器解析js代码前,他的预解析器会首先找到一些变量或把代码中的一些变量放入自己的仓库,在进行解析。
如:
预解析:
找一些东西:var、 function、 参数、a=未定义
所有变量,在正式运行代码之前,都提前赋一个值:未定义undefined
fn1=function fn1(){alert(2);} //所有的函数,在正式运行代码之前都是整个函数块
注意:遇到重名,变量和函数重名,就留下函数,与上下关系没有关系,注:只先找var ,function声明的,
如:
- console.log(a);
- var a=1;
- console.log(a);
- function a(){console.log(2);}
- console.log(a);
- var a=3;
- console.log(a);
- function a(){console.log(4);}
- console.log(a);
具体过程:
1.找到第一个var存值为undefined(注意不会为其赋值为1,而是undefined)
2.function a(){console.log(2);}代替前面var
3.var =3不会替代function
4.function a(){console.log(4);}替代function a(){console.log(2);}
5.预解析结果:把a=function a(){console.log(4);}存在预解析的仓库里面
(2)逐行解读代码
表达式= + - / ++ -- !参数等,(一个动作能够去做一些改变
)
如:
- alert(a);undefined
- var a=1;
- alert(a);//
表达式可以预解析该仓库里面的值
而function a(){alert(2);}只是一个声明并不会改变a的值
逐行解读代码的结果:
- console.log(a);//function a(){console.log(4);}
- var a=1;
- console.log(a);//
- function a(){console.log(2);}
- console.log(a);//
- var a=3;
- console.log(a);//
- function a(){console.log(4);}
- console.log(a);//
- //最后存在仓库里面的就是a=3一个数字
如:利用局部改全局
- var str="";
- function fn1(){
- var a='哈哈哈~';
- str=a;
- }
- fn1();
- //console.log(a);//Uncaught ReferenceError: a is not defined
- console.log(str);//哈哈哈~,利用局部改全局
如:函数内部调用外部函数:
- function fn2(){
- var a='这是fn2的东西!';
- fn3(a);
- }
- fn2();
- function fn3(b){
- console.log(b);//注:与fn2里面的a不一样,输出为这是"fn2的东西!"
- }
注:
if(){}
for(){} while()
不是作用域
注:
- <script type="text/javascript">
- window.onload=function(){
- var Btn=document.getElementsByTagName('input');
- var i=0;
- for(i=0;i<Btn.length;i++){
- Btn[i].onclick=function(){
- for(i=0;i<Btn.length;i++){
- Btn[i].style.background='red';//如果没有下面的for会出现Uncaught TypeError: Cannot read property 'style' of undefined
- }
- }
- }
- };
- </script>
JS解析+预解析相关总结的更多相关文章
- js的预解析
在ES6之前,变量使用var声明,会存在变量的预解析(函数也有预解析).ES6引了let和const,但是现阶段ES6并没有完全普及,而且很多比较老的代码都还是按照ES5的标准甚至是ES3的标准来书写 ...
- 两个实例轻松理解js函数预解析
js函数预解析 例子1: 先上一段代码,看看能不能写出最终的执行结果. console.log(a); var a = 1; console.log(a); function a(){ console ...
- 怎样理解JS的预解析机制
JS的预解析包括两部分: 1. 变量提升 2. 函数声明 对于变量提升, 可以看下下面这块代码 console.log(name); // undefined var name = "Lil ...
- JavaScript中hoisting(悬置/置顶解析/预解析) 实例解释,全局对象,隐含的全局概念
JavaScript中hoisting(悬置/置顶解析/预解析) 实例解释,全局对象,隐含的全局概念 <html> <body> <script type="t ...
- js的预解析详解
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 2.2、js基础---预解析和严格模式
一.语言特性 1.预解析:js会把变量的声明(仅仅是声明)提到顶部,但是不会突破作用域. alert(a);var a= 12; //结果,undefi ...
- js之预解析
一.所谓的预解析就是:在当前作用域中,JavaScript代码执行之前,浏览器首先会默认的把所有带var和function声明的变量进行提前的声明或者定义. 1)var声明的变量在预解析的时候只是提前 ...
- js的预解析和作用域
预解析指的就是,在js文件或者script里面的代码在正式开始执行之前,进行的一些解析工作.这个工作很简单,就是在全局中寻找var关键字声明的变量和通过function关键字声明的函数. 1.寻找 v ...
- js的预解析和代码执行相关规则
JavaScript解析过程分为两个阶段,一个是编译阶段,另外一个就是执行阶段. 1.编译阶段:又称为预解析阶段,在这个阶段JavaScript解释器将完成把JavaScript脚本代码转换到字节码. ...
随机推荐
- Bootstrap学习-其它内置组件
1.缩略图(一) 缩略图在网站中最常用的地方就是产品列表页面,一行显示几张图片,有的在图片底下(左侧或右侧)带有标题.描述等信息.Bootstrap框架将这一部独立成一个模块组件.并通过“thumbn ...
- MySql最左前缀原则
简单整理记录下,之前一直都没有关注过这个问题 最左前缀原则:顾名思义是最左优先,以最左边的为起点任何连续的索引都能匹配上, 注:如果第一个字段是范围查询需要单独建一个索引 注:在创建多列索引时,要根据 ...
- jQuery中获取特定顺序子元素(子元素种类不定)的方法
提出问题:只已知父元素和父元素中子元素的次序,怎么通过jQuery方法获得该元素? <p>第一部分:</p> <ul> <li>1</li> ...
- JavaWeb—Servlet
1.什么是Servlet 用来扩展web服务器功能的组件——早期的web服务器只能处理静态资源的请求,即需要事先将html文件准备好,并存放到web服务器上面.不能够处理动态资源的请求(需要计算,动态 ...
- Nginx配置参数说明
一.主配置段1.正常运行必备的配置#运行用户和组,组身份可以省略user nginx nginx; #指定nginx守护进程的pid文件pid path/to/nginx.pid; #指定所有work ...
- gearman background后台job状态获取
GearmanClient background job有一个方法叫: public array GearmanClient::jobStatus ( string $job_handle ) Get ...
- __init__和__new__
一.__init__方法是什么 __init__方法通常用在初始化一个类实例的时候, class Person(object): """Silly Person" ...
- Centos(Yum源更改)
第一步:备份你的原镜像文件,以免出错后可以恢复. [root@openstack yum.repos.d]#mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum. ...
- 【HackerRank】Find the Median(Partition找到数组中位数)
In the Quicksort challenges, you sorted an entire array. Sometimes, you just need specific informati ...
- 20145230《JAVA程序设计》第1周学习总结
20145230<JAVA程序设计>第一周学习总结 教材学习内容总结 在第一周的学习中,我初次认识了JAVA程序的一些基础知识.首先,我们需要在网上先下载JDK或者JDE,通过视频的学习, ...