【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解析+预解析相关总结的更多相关文章

  1. js的预解析

    在ES6之前,变量使用var声明,会存在变量的预解析(函数也有预解析).ES6引了let和const,但是现阶段ES6并没有完全普及,而且很多比较老的代码都还是按照ES5的标准甚至是ES3的标准来书写 ...

  2. 两个实例轻松理解js函数预解析

    js函数预解析 例子1: 先上一段代码,看看能不能写出最终的执行结果. console.log(a); var a = 1; console.log(a); function a(){ console ...

  3. 怎样理解JS的预解析机制

    JS的预解析包括两部分: 1. 变量提升 2. 函数声明 对于变量提升, 可以看下下面这块代码 console.log(name); // undefined var name = "Lil ...

  4. JavaScript中hoisting(悬置/置顶解析/预解析) 实例解释,全局对象,隐含的全局概念

    JavaScript中hoisting(悬置/置顶解析/预解析) 实例解释,全局对象,隐含的全局概念 <html> <body> <script type="t ...

  5. js的预解析详解

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 2.2、js基础---预解析和严格模式

    一.语言特性         1.预解析:js会把变量的声明(仅仅是声明)提到顶部,但是不会突破作用域.                 alert(a);var a= 12; //结果,undefi ...

  7. js之预解析

    一.所谓的预解析就是:在当前作用域中,JavaScript代码执行之前,浏览器首先会默认的把所有带var和function声明的变量进行提前的声明或者定义. 1)var声明的变量在预解析的时候只是提前 ...

  8. js的预解析和作用域

    预解析指的就是,在js文件或者script里面的代码在正式开始执行之前,进行的一些解析工作.这个工作很简单,就是在全局中寻找var关键字声明的变量和通过function关键字声明的函数. 1.寻找 v ...

  9. js的预解析和代码执行相关规则

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

随机推荐

  1. SOE 部署错误 ClassFactory cannot supply requested class

    问题描述: 部署完SOE,对某个服务启用部署的SOE时,出现错误信息,假如对地图服务SampleWorldCities启用刚部署的SOE,错误信息如下: service failed to start ...

  2. 通过天天模拟器加burpsuite抓取手机app流量

    通过天天模拟器,代理抓取安卓app数据包.也可以抓取https. 1.下载天天模拟器,官方下载即可,下载安装. 2.启动天天模拟器,设置代理,点击上方wlan设置图标,打开wlan设置,如下: 3.鼠 ...

  3. nginx反向代理三台web

    1.首先我们需要在服务器中三个不同名字,并将他们赋值 2.切换到nginx—conf  把三台机器的nginx的配置文件分别命名为web1.conf.web2.conf.web3.conf vim的赋 ...

  4. Linux中的history命令

    history -c  清空历史命令 -w 把缓存中的历史命令写入历史命令保存文件说明: a.在用户登录的时候执行的命令会先存在缓存里 b.当用户退出的时候会把缓存里的命令写到文件里 c.用会执行命令 ...

  5. 安装MYSQL时出现libaio.so.1 is needed by MySQL-server-5.5,49.1等等

    安装MYSQL是出现: warning: MySQL-server--.linux2..i386.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: ...

  6. vue-cli 搭建项目

    1.cnpm install -g vue-cli 2.vue -V(注意大写,查vue版本) 3.vue init webpack vue1(创建vue1目录) 4.cd vue1(定位到目录中) ...

  7. Python之内置函数再总结

    一.数字相关 1.绝对值:abs(-1) 2.最大最小值:max([1,2,3]) ,min([1,2,3]) 3.序列长度:len('abc')  ,  len([1,2,3])  ,  len(( ...

  8. render httprequest

    render def my_view(request):# View code here... t = loader.get_template('myapp/index.html') c = Requ ...

  9. 区块链入门级别认知(blockchain)

    区块链入门级别认知(blockchain) 前言:今天参加了迅雷关于区块链的大会,学习和感受总结一下 之前的认知在:几个混迹互联网圈关于区块链 耳熟能详的 热词 “比特币” “区块链” “挖矿” ,知 ...

  10. jQuery之DOM操作大全

    jQuery属性操作 获取元素属性的语法:attr(name) 例子:$("#img1").attr("src"); 设置元素单个属性的语法:attr(key, ...