例1、

<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script type="text/javascript">
global = 100
function fn(){
console.log(global);
global = 200;
console.log(global);
var global = 300
}
fn()
var global;
</script>
</body>
</html>

执行分析

先生成GO{}

GO{

  global:100

  fn:function(){}

}

函数fn执行前生成AO{}

AO{

  global:undefined

}

AO中有自己的变量global,不调用GO的global。(就近原则)

执行结果

例2

<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script type="text/javascript">
function test(){
console.log(b)
if(a){
var b = 100;
}
c = 234;
console.log(c);
}
var a;
test();
a = 10;
console.log(c);
</script>
</body>
</html>

执行分析

首先生成GO

GO{

  a:undefined

  test:function test(){}

}

执行test()行时生成AO{}  不要受 if 的影响。

AO{

  b:undefined

}

//第一个输出为undefinded

接着执行if()模块

此时a为undefined,if()模块为false

接着GO{}中添加一个属性c,值为234

第二个输出为234  第三个输出是234.

执行结果

例3(百度2013笔试题

1)

<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script type="text/javascript">
function bar(){
return foo;
foo = 10;
function foo(){ }
var foo = 11;
}
document.write(bar())
</script>
</body>
</html>

2)

<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script type="text/javascript">
function bar(){
foo = 10;
function foo(){ }
var foo = 11;
return foo;
}
document.write(bar())
</script>
</body>
</html>

1)的预编译分析

执行bar()生成一个AO对象 bar(){}函数中有var foo = 11,即有变量声明foo,值为undefined,  接着有函数function foo(){} ,foo的值被覆盖 为functoin(){}

AO{

  foo:undefined   --->   foo:function(){}

}

执行结果

2)的预编译分析

同上,最后foo的值被覆盖为11  并return。

执行结果

javascript预编译练习(变态篇)的更多相关文章

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

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

  2. javaScript 预编译过程浅尝

    javaScript 预编译过程 1.创建AO对象(Activation Object) AO{ a: } 2.找形参和变量声明,将变量和形参作为AO属性名,值为undefined AO{ a:und ...

  3. JavaScript 预编译与作用域

    JavaScript 预编译与作用域 JavaScript 预编译的过程和作用域的分析步骤是 JS 学习中重要的一环,能够帮助我们知道代码的执行顺序,更好理解闭包的概念 预编译 JavaScript ...

  4. javascript预编译的过程

    预编译的两种情况 全局: 1.全局 直接是script标签中的代码,不包括函数执行执行前:1.首先生成一个GO(global object)对象,看不到,但是可以模拟出来用来分析2.分析变量声明,变量 ...

  5. Javascript - 预编译与函数词法作用域

    预编译与函数词法作用域(Precompiled & Scoped) 预编译 Javascript脚本的宿主在执行代码之前对脚本做了预编译处理,比如浏览器对Js进行了预编译,编译器会扫描所有的声 ...

  6. JavaScript预编译详解

    一.js运行三部曲: 1.语法分析(通篇扫描看有没有语法错误) 2.预编译 3.解释执行 二.预编译前奏 1.imply global 暗示全局变量:任何变量如果未经声明就赋值,此变量为全局对象所有 ...

  7. 浅谈JavaScript预编译原理

    这两天又把js的基础重新复习了一下,很多不懂得还是得回归基础,大家都知道js是解释性语言,就是编译一行执行一行,但是在执行的之前,系统会做一些工作: 1,语法分析: 2,预编译: 3,解释执行. 语法 ...

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

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

  9. JavaScript预编译过程理解

    1-JavaScript运行三部曲 语法分析 预编译 解释执行 语法分析很简单,就是引擎检查你的代码有没有什么低级的语法错误: 解释执行顾名思义便是执行代码了: 预编译简单理解就是在内存中开辟一些空间 ...

随机推荐

  1. BZOJ4353 Play with tree[树剖]

    复习几乎考不到的树剖.维护min以及min个数,打set和add标记即可,注意set优先级优于add. #include<iostream> #include<cstdio> ...

  2. vue项目 WebViewJavascriptBridge 适配android和ios

    前言 最近在app 原生页面 嵌套 做Vue 的H5,混合开发,当然原生和Vue 交互方面当然用到 WebViewJavascriptBridge 这个东西啦, 当然在用到的时候也有问题,可以参考大佬 ...

  3. MySQL-InnoDB锁(一)

    本文主要记录InnoDB存储引擎中锁的关键点,下篇文章通过实例确认加锁的范围. InnoDB中的锁 1. 锁提供数据完整性和一致性 2. InnoDB行级锁:共享锁(S)和排他锁(X). 为了支持多粒 ...

  4. gdb插件gef安装爬坑

    0x00: gdb是linux下的调试利器,但无奈界面不太友好,所以需要一些辅助插件. 0x01:关于插件选择 之前我一直使用的是pead,之前了解到还有个插件gef,因为gef支持多构架,而且hea ...

  5. matlab函数 bsxfun浅谈(转载)

    关于matlab函数 bsxfun本文来源:http://blog.sina.com.cn/s/blog_9e67285801010ttn.html a=[1 2 3];b=[1 2 3]';c=bs ...

  6. 「美团 CodeM 初赛 Round A」试题泛做

    最长树链 树形DP.我们发现gcd是多少其实并不重要,只要不是1就好了,此外只要有一个公共的质数就好了.计f[i][j]表示i子树内含有j因子的最长链是多少.因为一个数的不同的质因子个数是log级别的 ...

  7. yolov3 in PyTorch

    https://github.com/ultralytics/yolov3 Introduction简介 This directory contains PyTorch YOLOv3 software ...

  8. 从零开始学习Gradle之三---多项目构建

       随着信息化的快速发展,IT项目变得越来越复杂,通常都是由多个子系统共同协作完成.对于这种多系统.多项目的情况,很多构建工具都已经提供了不错的支持,像maven.ant.Gradle除了借鉴了an ...

  9. xcode6 如何编译64位iOS应用

    原文:http://mobile.51cto.com/hot-412500.htm 随着iPhone5S的推出,大家开始关心5S上所使用的64位CPU A7. 除了关心A7的性能以外,大家还会关心一个 ...

  10. anaconda环境管理

    创建新环境 conda create -n rcnn python=3.6 删除环境 conda remove -n rcnn --all 重命名环境 参考SO:https://stackoverfl ...