一、预解析

  JavaScript 在执行前会进行类似“预解析”的操作:首先会创建一个在当前执行环境下的活动对象, 并将那些用 var 声明的变量、定义的函数设置为活动对象的属性, 但是此时这些变量的赋值都是 undefined (只有在运行时才执行赋值操作), 事先构造运行环境例如全局环境, 函数运行环境, 还要构造作用域链

  在 JavaScript 我们可以直接赋值给没有被 var 定义的变量, 不过此时你这么操作变量, 不管这个操作是在全局作用域里还是在局部作用域里, 变量最终都是属于window对象

二、解释执行

  在javascript解释执行阶段, 遇到变量需要解析时, 会首先从当前执行环境的活动对象中查找, 如果没有找到‍, 而且该执行环境的拥有者有 prototype 属性时则会从 prototype 链中查找, 否则将会按照作用域链查找, 遇到var a = …这样的语句时会给相应的变量进行赋值(注意:变量的赋值是在解释执行阶段完成的, 如果在这之前使用变量, 它的值会是undefined)

var a = 1;
function hehe() {
  window.alert(a);
  var a = 2;
  window.alert(a);
}
hehe();

运行结果为:

"undefined"

"2"

原因: 预编译阶段, 局部作用域(here函数内部)下变量 a 被重新定义了, 所以函数内部 a 不再属于全局变量, 而是属于函数作用域, 只不过赋值操作是在运行期执行, 所以第一次使用 a 变量时候, a 变量在局部作用域里没有被赋值, 只有栈区的标示名称, 因此结果就是 undefined 了

JavaScript-深入理解JavaScript(一、预编译和执行过程)的更多相关文章

  1. javascript预编译和执行过程总结

    javascript相对于其它语言来说是一种弱类型的语言,在其它如java语言中,程序的执行需要有编译的阶段,而在javascript中也有类似的“预编译阶段”(javascript的预编译是以代码块 ...

  2. javascript的预编译和执行顺序

    原文:javascript的预编译和执行顺序 最近在复习javascript的事件处理时发现了一个问题,然后也是我来写javascript的预编译和执行顺序的问题 代码: 代码一<html> ...

  3. JS的预编译和执行顺序 详析(及全局与局部变量)

    最近在复习javascript的事件处理时发现了一个问题,于是总结一下:javascript的预编译和执行顺序的问题:   <html> <head> <title> ...

  4. JS的预编译和执行顺序 详析

    原文:JS的预编译和执行顺序 详析 最近在复习javascript的事件处理时发现了一个问题,然后也是我来写javascript的预编译和执行顺序的问题   代码:   复制代码 代码一 <ht ...

  5. javascript引擎执行的过程的理解--语法分析和预编译阶段

    一.概述 js是一种非常灵活的语言,理解js引擎的执行过程对于我们学习js是非常有必要的.看了很多这方便文章,大多数是讲的是事件循环(event loop)或者变量提升的等,并没有全面分析其中的过程. ...

  6. 关于JavaScript预编译和执行顺序以及函数引用类型的思考

    昨晚在对项目中的一部分做模块化处理的时候,遇到了一个问题,一个重新定义的function对一个通用类中的function进行赋值覆盖的时候,失败了.问题抽象出来是这样的: <script > ...

  7. 第一百二十九节,JavaScript,理解JavaScript库

    JavaScript,理解JavaScript库 学习要点: 1.项目介绍 2.理解JavaScript库 3.创建基础库 从本章,我们来用之前的基础知识来写一个项目,用以巩固之前所学.那么,每个项目 ...

  8. JS 的预编译和执行顺序

    脚本执行js引擎做的工作: 语法分析 预编译 解释执行

  9. C++ 编译,执行过程 具体解释。

    要更深入了解C++, 必需要知道一个程序从開始到结束都干了些什么, 怎么干的. 所以我从C++编译到执行过程,解析下程序是怎么跑的. 首先,初略的说一下之前C++的编译过程.C++编译过程包含预编译- ...

随机推荐

  1. BZOJ 3289 Mato的文件管理(莫队+树状数组)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3289 [题目大意] 求静态区间逆序对. [题解] 我们对查询进行莫队操作,对于区间的删 ...

  2. ThreadPoolExecutor(线程池)源码分析

    1. 常量和变量 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); // 高3位为线程池的运行状态,低29 ...

  3. android中自定义checkbox的图片和大小

    其实很简单,分三步: 1.在drawable中创建文件checkbox_selector.xml: <?xml version="1.0" encoding="ut ...

  4. [转][Navicat for MySQL系列]Navicat如何使用(二)

    上一篇经验已经建立了数据连接,这篇我介绍一下Navicat for MySQL的“增删改查”功能是如何操作的. 工具/原料 Navicat for MySQL 10.1.7 数据库操作(基本) 1 远 ...

  5. 对js原型简单的理解和图解

    对js原型简单的理解和图解 最近在努力的学习js中,今天就抽了个空把自己理解的原型,记下一下在笔记中,以后自己查看,有空在会把原型链记录一下. 1.prototype prototype:是一个函数的 ...

  6. win7与Ubuntu 13.04双系统修改启动项顺序

    在在win7下安装了Ubuntu 13.04后,在grub中,win7启动想是最后一个,为了把win7设置为默认启动项,需要更改grub设置.google了半天,发现更改/etc /default/g ...

  7. 如何在form初始化时自动隐藏FOLDER列

    方法1:直接设定PROMPT列和数据列ITEM的VISIBLE属性为No 方法2:在WHEN-NEW-FORM-INSTANCE触发器里: l_old_itm := :system.cursor_it ...

  8. redigo简单理解

    package main import ( "fmt" "github.com/gomodule/redigo/redis") func main() { // ...

  9. jenkins平台通过maven方式使用sonar报大量关于html/css/js的错误解决办法

    1.如果项目只关注java的源代码扫描,可以在sonar上把检查html.css.js的插件卸载,让后重启sonar避免不需要检查的内容报错误

  10. iOS:UIView的CALayer基本演练

    UIView的CALayer基本演练的属性和注意事项: 在UIView中创建一个按钮UIButton,然后设置UIButton的Layer属性 –圆角.边框.阴影及3D形变属性 注意: 1.在UIVi ...