【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. jenkins配置SVN报错

    jenkins配置SVN报错,如图:

  2. windows下python调用c文件流程

    1.新建fun.c文件和fun.h文件 #include <stdio.h> #include <stdlib.h> #include <string.h> int ...

  3. 爬虫四 selenium模块详细参数

    selenium元素定位方法 一.访问页面并获取网页html from selenium import webdriver browser = webdriver.Chrome() browser.g ...

  4. 剑指offer 面试53题

    面试53题: 题目:统计一个数字在排序数组中出现的次数. 思路:二分查找法,分别找到此数字在排序数组中第一次和最后一次出现的位置,然后次数等于两个位置之差加1. 时间复杂度:O(log n) 解题代码 ...

  5. JAVA抠取Excel中的图片

    EXCEL中扔了一堆的图片,老大让对应到数据库中的数据上.思路先把图片抠出存成单个图片.然后上传到服务器,取下路径更新到数据库中. 注释掉的部分为有多个Excel时使用. package com.** ...

  6. requirejs源码分析: requirejs 方法–1. 主入口

    该方法是 主要的入口点 也是最常用的方法. req = requirejs = function (deps, callback, errback, optional) { //Find the ri ...

  7. OC自动释放池autoreleasepool介绍

    自动释放池的机制是:它使得应用在创建新对象时,系统能够有效地管理应用所使用的内存. @autoreleasepool { statements } 在创建新对象时,并且系统未启动ARC特性,那么在使用 ...

  8. Android 平台电容式触摸屏的驱动基本原理

    Android 平台电容式触摸屏的驱动基本原理 Android 平台电容式触摸屏硬件基本原理 Linux 与 Android 的多点触摸协议 Linux输入子系统:事件的编码

  9. 【鸟哥的Linux私房菜】笔记1

    Linux是什么 从操作系统与cpu架构关系到linux  Richard Mathew Stallman GPL 关于GNU计划 Linux的发展 Linux的核心版本 Linux的特色 Linux ...

  10. iOS_KVC与KVO

    目 录: 一.KVC   二.KVO                                                                                   ...