js预解析问题总结

//示例 1
alert(a)       // undefind。
alert(fn)      // function 整个函数块。

var a = 1;
function fn(){
    return falss;
};

为什么?第一个是 undefind , 第二个是 functin 函数块。这是怎么运行的?

js解析器在运行js代码的时候 分为两步:

  1. 第一步 把所有的 变量函数参数 提前到当前作用域的顶部。
  2. 第二步 逐行解读代码 从左到右从上至下
//示例 1 解释
var a;              //  a 变量 提前到整个作用域的前面 当前值 为 undefind。
function fn(){
    return false;
};                  //  fn 函数 提前整个作用域的前面 当前值 就是整个函数块。

alert(a);           //  undefind。
alert(fn);          //  function 整个函数块。
a=1;                //  a 赋值 1 现在 a  变量才拥有 值:1
function fn(){
    return false;
};                  //  函数 一直没变只不过被提前的 作用域 前面了。我记着有句话是这样说的:
                    //  函数在那定义 不重要 重要的是在那调用。
                    // (因为定义完以后它都会被提前到 当前 作用域 的前面,在那调用 在哪个作用域生效)

tips:解析引擎以块为单位级别,执行所有Var变量的创建,并赋予一个初始值undefined。

// 示例 3 

alert(a);         // a 函数块。
var a = 1;
alert(a)          // a 赋值后 等于 1。
function a(){
    return false;
}
// 示例 3 解释

var a;                  // 首先提前 变量 当前值 为:undefind。
function a(){
    return false;
};                      // 遇到函数 提前函数 注意:当前函数命 和 上面的变量名 一样 竟然一样怎么办呢?
                        // 不要急 js解析器已经做了处理 同名的函数会替换掉 同名的 变量 现在就只剩下 a 函数块 自己了。

alert(a);               // 因为 上面 只剩下 a 函数了 所以现在就弹出 a函数的整个函数块。
a = 1;                  // a = 1 表达式赋值 所以就又把 a 函数给替换成了 变量 值为:1。
alert(a);               // 现在 弹出 的值就是被改变过的 a 值为 1;
function a(){           // 这个函数现在就没用了。
    return false;
};

带参数的预解析方式:注意此处就有了作用域的问题了

//示例 4
var a = 1;
function fn1(a){
    alert(a);
    a = 2;
};
fn1();                                // undefind。
alert(a);                             // a 值为: 1。
//示例 4 解释
var a;                                // a 变量 提前 当前值:undefind。(全局变量)
function fn1(a){
    alert(a);
    a = 2;
};                                   // fn1 函数块提前 值为: 整个函数
                                      // 该提前的都提前的现在开始 逐行 解读代码,
                                      // 等等  有人会说那 参数 呢? 哈哈哈 不要着急还没到它呢。

var a = 1;                            // a = 1 赋值表达式 改变 变量 a 值为:1。
function fn1(a){
        var a;                        //参数被当成变量 解析到当前函数 顶部。
    alert(a);                         // a 当前函数内 a 值为:undefined.
    a = 2;                            // a = 2 复制表达式 无用
};                                   // 函数块 没有遇到调用 无用。
fn1();                                // 现在遇到函数fn1 的调用了 咱们就去它里面看看 。
                                      // 调用成功后 弹 undefind。
alert(a);                             // 这个 还是调用 全局的变量 a 值 为 1。
时间: 2024-07-31 08:28:18

js预解析问题总结的相关文章

1、JS预解析原理(一)

一.作用域概念.预解析规则.表达式 1.作用域概念 什么是作用域:简单说就是作用的范围,指的是函数在哪些范围内可以用,而在其他部分就不可以使用,如果需要使用就需要重新定义. 作用域的作用是什么:用来执行读或者写的操作. 2.预解析规则 script:自上而下进行解析, 函数:由里到外进行解析. 但是浏览器在执行JS代码的时候会分成两部分操作:预解析以及逐行执行代码 预解析:浏览器在开始工作的时候会先解读JS代码的关键字:比如:var function 参数等,并把解析到的内容存入一个类似仓库的地

Js 预解析

今天本来是要看作用域的,不知怎么就稀里糊涂的学习了一边预解析,下面给朋友们介绍一下我对 js 预解析的理解. //示例 1 alert(a) // undefind. alert(fn) // function 整个函数块. var a = 1; function fn(){ return falss; }; 为什么?第一个是 undefind , 第二个是 functin 函数块.这是怎么运行的?这就要 稍微介绍一下 js解析器的运行方法.扩展:什么事js解析器 js解析器在运行js代码的时候

JS预解析

1.在逐行读js代码前,解析器会先提取所有声明的var变量和函数 js解析器会先把脚本里所有var变量声明读一遍,但是它只读变量名字,不读变量值,一开始它会赋给所有读到的var变量一个[未定义]的值.而js解析器提取函数是整块提取的读出来,把函数当作整体来看待,也就是说读变量是没值的,读函数是有内容的.这个过程就是js的预解析 所以在逐行读代码的这一步时,解析器每找到一个var声明,就会去看先前提取的东西中有没有它的值(往往是[未定义]) 2.var a=0; var是声明, a=0是表达式 如

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

从字面上理解----域就是空间.范围.区域,作用就是读.写,所以作用域我们可以简单理解为:在什么样空间或者范围内对数据进行什么样的读或写操作. 看一下代码 alert(a); // 为什么是undefined var a = 1; alert(a); //为什么浏览器无反应 a = 1; 要了解为什么这些现象必须先知道浏览器是如何读取js代码,而这段浏览器专门用来读取js代码的片段我们称之为-----js解析器  首先,我们来理解“JS解析器”是如何工作的? 先看如下代码 alert(a); /

js预解析相关知识总结

js的预解析特别有意思,像在做智力题一样有意思~ 预解析 预解析:在解释这行代码之前发生的事情--变量的声明提前了,函数的声明提前 console.log(num) --未定义Num,结果是报错 var num; console.log(num)--结果是undefined console.log(num) var num = 10;--结果是undefined 注意:预解析分段,多对的script标签中如果函数名相同,互不影响 原文地址:https://www.cnblogs.com/code

JS预解析与变量提升

预解析 JavaScript代码的执行是由浏览器中的JavaScript解析器来执行的.JavaScript解析器执行JavaScript代码的时候,分为两个过程:预解析过程和代码执行过程 预解析过程: 把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值. 把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用. 先提升var,在提升function. JavaScript的执行过程 // 案例1 var a = 25; function abc() { alert(a)

JS解析+预解析相关总结

[js预解析机制]先来说说js的解析机制吧,浏览器在解析js代码时是从上到下解析的.解析顺序如:(1)预解析    找var和function (2)逐行代码解析    表达式    函数调用    fn1()函数内部再发生{    (1)预解析    (2)逐行代码解析} 解析:由子级到父级寻找变量,称作用域链 如:函数参数,为局部变量 <script type="text/javascript"> var a=1; function fn1(a){//把a作为参数传进来

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

hey,guys!我们一起总结一下JS预解析吧! 首先,我们得搞清楚JS预解析和JS逐行执行的关系.其实它们两并不冲突,一个例子轻松理解它们的关系: 你去酒店吃饭,吃饭前你得看下菜谱,点下菜(JS预解析),但吃的时候还是一口一口的吃(JS逐行执行)! OK,解决下面五个问题,JS预解析就算过了~~(前提:对JS变量作用域有清晰理解) 一.JS预解析是什么? 其实就是对程序要用到的材料(变量,函数)给一个初始值,并存到一个表中(我自己虚构的),当程序运行到那一行时,就来这个表看有没有初始值,没有就

JS的解析机制

JS的解析机制,是JS的又一大重点知识点,在面试题中更经常出现,今天就来唠唠他们的原理.首先呢,我们在我们伟大的浏览器中,有个叫做JS解析器的东西,它专门用来读取JS,执行JS.一般情况是存在作用域就存在解析,那它是怎么运行的呢.首先呢,然后分成两大步骤. 1 第一步叫做JS预解析,这一步骤实际上是一种准备工作把,在执行之前,它会先浏览整个代码,然后寻找三种东西. 1var  2 函数声明    我来分别解释一下.首先它会提取带var声明的变量,然后放到作用域中,但是不会提取变量的值,会先给他赋