//示例 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。

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

  1. js预解析相关知识总结以及一些好玩的面试题

    js预解析的题像在做智力题一样有意思~ 预解析 预解析:在解释这行代码之前发生的事情——变量的声明提前了,函数的声明提前 console.log(num) ——未定义Num,结果是报错 var num ...

  2. js预解析及特效

    预解析: // 作用域: // 域:空间.范围.区域…… // 作用:读.写 script 全局变量.全局函数 自上而下 函数 由里到外 {} 浏览器: “JS解析器” 1)“找一些东西” :var ...

  3. JS预解析

    1.在逐行读js代码前,解析器会先提取所有声明的var变量和函数 js解析器会先把脚本里所有var变量声明读一遍,但是它只读变量名字,不读变量值,一开始它会赋给所有读到的var变量一个[未定义]的值. ...

  4. [妙味JS基础]第六课:作用域、JS预解析机制

    知识点总结 浏览器的解析方法 script 全局变量,全局函数 自上而下 函数 由里到外 "JS的解析器": 1)“找一些东西”:var function 参数 var a=未定义 ...

  5. javascript . 03 函数定义、函数参数(形参、实参)、函数的返回值、冒泡函数、函数的加载、局部变量与全局变量、隐式全局变量、JS预解析、是否是质数、斐波那契数列

    1.1 知识点 函数:就是可以重复执行的代码块 2.  组成:参数,功能,返回值 为什么要用函数,因为一部分代码使用次数会很多,所以封装起来, 需要的时候调用 函数不调用,自己不会执行 同名函数会覆盖 ...

  6. JS预解析机制

    JS的预解析过程: 1,预解析 2,再逐行解读代码, 实例: ---------------------------- <script>        var name="xm& ...

  7. js 预解析

    前言 JavaScript是解释型语言是毋庸置疑的,但它是不是仅在运行时自上往下一句一句地解析的呢? 事实上或某种现象证明并不是这样的,通过<JavaScript权威指南>及网上相关资料了 ...

  8. js---07 js预解析,作用域---闭包

    js解析器首先不会逐行读代码,这是第二部了. 首先 根据var找到变量,根据function找函数,找到变量var a = 1,js解析器只会读取等号前面的var a,并把a设置值未定义,并不会读取等 ...

  9. js 预解析以及变量的提升

    js在执行之前会进行预解析. 什么叫预解析? 预:提前 解析:编译 预解析通俗的说:js在执行代码之前会读取js代码,会将变量声明提前. 变量声明包含什么?1.var 声明 2.函数的显示声明. 提前 ...

随机推荐

  1. Maven直接部署Web应用Tomcat

    1. 下载解压版tomcat,并配置环境变量.所以tomcat你可以成功启动. 使用版本解压tomcat可以方便查看tomcat的后台输出的出错信息,便于调试. 2. 给tomcat配置用户名密码. ...

  2. JavaScript之一: 闭包、执行环境、作用域链

    这是大虾的第一篇博文,大虾试图用最直白的语言去描述出所理解的东西,大虾是菜鸟,水平有限,有误的地方希望路过的朋友们务必指正,谢谢大家了. 从读书时代一路走来,大虾在学习的时候逐渐喜欢上了去追寻根源,这 ...

  3. SQLServer-----使用jTDS连接SQLServer数据库

    一.jTDS一个简短的引论 jTDS100%纯Java实现的JDBC3.0驱动,它用于连接 Microsoft SQL Server(6.5.7.2000,2005,2008 和 2012)和Syba ...

  4. iOS学习 plist读取和写入文件

    干iOS开发时间.后经常用来plist文件,  那plist什么文件是它? 它的全称是:Property List.属性列表文件.它是一种用来存储串行化后的对象的文件.属性列表文件的扩展名为.plis ...

  5. 解决 configure.ac:17: error: possibly undefined macro: AC_PROG_LIBTOOL

    当安装configure.ac:17: error: possibly undefined macro: AC_PROG_LIBTOOL If this token and others are le ...

  6. 采购申请 POCIRM-001:ORA-01403: 无论数据未找到

    今天就让同事帮忙看问题.当请求生成采购订单,在销售模块错误提交销售订单 查看请求日志 +-------------------------------------------------------- ...

  7. /proc/mtd 各参数的含义 -- linux内核

    经/proc虚拟文件系统读取MTD分区表:cat /proc/mtd mtd .name = raspi, .size = 0x00400000 (4M) .erasesize = 0x0001000 ...

  8. Unity + iBatis + Asp.net Mvc 系统搭建

    Unity + iBatis + Asp.net Mvc 系统搭建 之前用EntityFramework Code First做了一些小项目,很是方便:后来在一个 Java 项目中接触了myBatis ...

  9. 使用Maven在Eclipse中创建Web项目[转]

    一.新建 Maven Web项目 1.新建Maven Project new project-->选择 Maven Project --> 下一步 选择工作空间 -->下一步 在Fi ...

  10. JBPM——MyEclipse开发环境的搭建

    第一次接触JBPM我不知道如何在工程中的应用.查了一些资料.大约在JBPM随着时代的发展有一定的了解.首先JBPM它是JBoss件平台的一个组成部分.是一个灵活的,易扩展的工作流管理系统,仅仅只是这个 ...