JavaScript是一种脚本语言, 它的执行过程, 是一种翻译执行的过程。并且JavaScript是有预编译过程的,在执行每一段脚本代码之前, 都会首先处理var关键字和function定义式(函数定义式和函数表达式)。

一、变量执行之前,会被赋为undefined

<p id="scope2" style="color:red"></p>

     function echo(p, html) {p.innerHTML += html + '<br/>';}var pscope2 = document.getElementById('scope2');echo(pscope2, typeof param); //结果:undefinedvar param = 'defined';echo(pscope2, typeof param); //结果:string

在调用函数执行之前, 会首先创建一个活动对象,然后搜寻这个函数中的局部变量定义和函数定义,变量的值会在真正执行的时候才计算,此时只是简单的赋为undefined。

二、函数定义式和函数表达式的不同

     echo(pscope2, typeof scope2); //结果:functionecho(pscope2, typeof func); //结果:undefinedfunction scope2() { //函数定义式};var func = function() { //函数表达式};echo(pscope2, typeof func); //结果:function

对于函数定义式, 会将函数定义提前。而函数表达式,会在执行过程中才计算。

三、以段为处理单元

<script type="text/javascript">echo(pscope2, typeof scope_next2);//结果:undefined
</script>
<script type="text/javascript">function scope_next2() {};
</script>

<script type="text/javascript">function scope_next2() {//以段为处理单元pscope2.innerHTML += 'in first scope_next2<br/>';};//echo(pscope2, typeof scope_next2);//结果:undefinedscope_next2();
</script>
<script type="text/javascript">var pscope2 = document.getElementById('scope2');function scope_next2() {pscope2.innerHTML += 'in second scope_next2<br/>';}scope_next2();
</script>

两个同名的函数scope_next2,分别输出不同的内容,后一个没有将前面一个的内容覆盖掉。

对预编译的理解上可能还有些问题,欢迎大家来指正。

JavaScript作用域原理——预编译相关推荐

  1. Javascript作用域原理---预编译

    问题的提出 首先看一个例子: var name = 'laruence'; function echo() { alert(name); var name = 'eve'; alert(name); ...

  2. 函数的作用域以及预编译

    一.函数的作用域 函数作用域有点像单面镜(外面看不到里面,里面可以看到外面) JS的特点:单线程.是 解释性语言 (翻译一行,执行一行) 二.预解析 JS预解析三部曲:语法解析 ⇒ 预编译 ⇒ 解释执 ...

  3. 预编译、作用域链和闭包理解

    在理解预编译之前,首先了解一下JS的解析过程:JS引擎在解析脚本的过程分为两个阶段,预编译和执行,首先预编译然后再从上之下一行一行的执行代码.其次,要了解作用域,作用域是一个变量或者函数能够使用的空间 ...

  4. JavaScript作用域学习笔记(ife2015spring学习心得)

    本文参照以下两位前辈的文章,加上自己的见解,有错误之处还望大家指出 鸟哥:Javascript作用域原理 理解 JavaScript 作用域和作用域链 为什么要理解作用域 初学js便听人说这门语言作用 ...

  5. [JavaScript] JavaScript作用域深度解析

    JavaScript作用域 JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里. -- JS权威指南 在JS里,一切皆对象,函数也是. 一.有什么用 什么时候会用到它? ...

  6. AO对象与GO对象——预编译(1)

    文章目录 JS引擎都做了什么? 函数声明提升 var关键字的声明提升,赋值不提升 一个奇奇怪怪的例子 暗示全局变量 AO对象 GO对象 AO和GO综合练习 JS引擎都做了什么? 1.检查通篇的语法错误 ...

  7. JavaScript中函数作用域之精辟,函数原理的浅入深出,及程序执行预编译之通天编译???

    1.程序执行的前一刻会先将代码预编译一遍,如果有语法错误则直接终止程序运行 //预编译之通天编译 --> 在执行的前一刻,会把文件通天扫描一遍 /** //预编译 函数整体提升(即函数会放到程序 ...

  8. JavaScript的预编译及执行顺序

    从JavaScript引擎的解析机制来探索JavaScript的工作原理,下面我们以更形象的示例来说明JavaScript代码在页面中的执行顺序. 如果说,JavaScript引擎的工作机制比较深奥是 ...

  9. javascript运行过程中的“预编译阶段”和“执行阶段”

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

最新文章

  1. 创建数据库,指定数据库的字符集和编码顺序
  2. day13 paramiko、数据库表操作
  3. Runtime 系列 3-- 给 category 添加属性
  4. 求一个字符串中连续出现次数最多的子串
  5. java二位数组biaoda_1 面向对象前部分
  6. optee中的thread_vector_table线程向量表
  7. anyproxy学习4-Linux(Centos)搭建anyproxy环境
  8. 开启防火墙web服务器访问权限 开启必要端口共外部使用
  9. (转)使用Spring的注解方式实现AOP的细节
  10. SQL基础笔试题--(一)
  11. 清除tomcat缓存
  12. 5GNR解调分析手持式频谱分析仪
  13. FCC认证和3C认证区别
  14. Ubuntu16.04系统下FastDFS+Nginx安装配置
  15. 【Linux学习笔记】last命令
  16. 【智能优化算法】基于分段权重和变异反向学习的蝴蝶优化算法求解单目标优化问题附matlab代码
  17. 震惊!用盗版CorelDRAW竟然会这样!
  18. 数据库关于索引问题(违反唯一约束)
  19. 【工作感悟】路自在前,冷暖自知
  20. linux如何简单隐藏文件及显示隐藏文件

热门文章

  1. 云评测、云监测、云加速,性能魔方mmTrix全球速度最快
  2. Silverlight 预定义颜色速查表
  3. 《CLR via C#》笔记——CLR的执行模型
  4. SEO内部链接优化的技巧
  5. 高并发场景下数据库的常见问题及解决方案
  6. 作为互联网流量入口,CDN日志大数据你该怎么玩?
  7. Android API 中文 (51) —— ZoomButtonsController
  8. 【Appium】Appium+Python环境搭建
  9. 【分享】School Rumble校园迷糊大王PSP姐姐事件+PS2游戏第一,二学期【带VNR翻译教程】...
  10. 用createrepo命令创建自己的yum源