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); //结果:undefined
var param = 'defined';
echo(pscope2, typeof param); //结果:string

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

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

     echo(pscope2, typeof scope2); //结果:function
echo(pscope2, typeof func); //结果:undefined
function 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);//结果:undefined
scope_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,分别输出不同的内容,后一个没有将前面一个的内容覆盖掉。

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

修改记录:

2014.9.29  修改以段为处理单元的事例代码。

demo下载:

http://download.csdn.net/detail/loneleaf1/7983577

2014.9.29 demo下载:

http://download.csdn.net/download/loneleaf1/7989605

参考资料:

http://www.laruence.com/2009/05/28/863.html Javascript作用域原理

http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html JavaScript 开发进阶:理解 JavaScript 作用域和作用域链

http://www.cnblogs.com/zxj159/archive/2013/05/30/3107923.html Javascript之匿名函数(模仿块级作用域)

http://www.web-tinker.com/article/20331.html try-catch语句的“伪块作用域”

http://msdn.microsoft.com/zh-cn/library/bzt2dkta%28v=vs.94%29.aspx 变量作用域 (JavaScript)

http://www.cnblogs.com/rubylouvre/archive/2009/08/21/1551270.html javascript变量的作用域

http://www.nowamagic.net/librarys/veda/detail/896 深入浅出JavaScript变量作用域

JavaScript作用域原理(二)——预编译的更多相关文章

  1. JavaScript作用域原理(三)——作用域根据函数划分

    一.一个for实例 <p id="scope3" style="color:red"></p> var pscope3 = docume ...

  2. JavaScript作用域原理(一)——作用域链

    一.作用域的描述 JavaScript权威指南中对作用域有一句很精辟的描述:“JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里.” 在JavaScript中,作用域的 ...

  3. JavaScript作用域原理——预编译

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

  4. 转载:Javascript作用域原理

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

  5. JavaScript-深入理解JavaScript(一、预编译和执行过程)

    一.预解析 JavaScript 在执行前会进行类似“预解析”的操作:首先会创建一个在当前执行环境下的活动对象, 并将那些用 var 声明的变量.定义的函数设置为活动对象的属性, 但是此时这些变量的赋 ...

  6. javascript作用域原理

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

  7. 我的JavaScript笔记--数据类型,预编译,闭包

     在我们js中存储数据的空间可以分为两种,堆内存和栈内存 堆内存:我们定义的那些引用数据类型的数据都会在堆内存中开辟空间. 栈内存:我们运行的js代码还有我们定义的基本数据类型,都直接在栈内存中存储 ...

  8. How Javascript works (Javascript工作原理) (二) 引擎,运行时,如何在 V8 引擎中书写最优代码的 5 条小技巧

    个人总结: 一个Javascript引擎由一个标准解释程序,或者即时编译器来实现. 解释器(Interpreter): 解释一行,执行一行. 编译器(Compiler): 全部编译成机器码,统一执行. ...

  9. JavaScript作用域原理——作用域根据函数划分

    一.一个for实例 <p id="scope3" style="color:red"></p> var pscope3 = docume ...

随机推荐

  1. rabbitmq安装

    1.从源码安装最新的otperlang17,版本(otp_src_17.1.tar.gz): ./configure make make install 2.有可能要安装    和simplebean ...

  2. 【原】react-router项目实战

    摘要: react-router相对于flux和redux来说,比较好容易理解一点和容易入门一点.这个是根据我之前的一个项目,然后我用react+react-router+webpack重新写的. 不 ...

  3. 【视频教程】使用UIAutomation开发软件外挂

    UIAutomation是.Net 3.5之后提供的“界面自动化测试”技术,本来是给测试人员用的,不过UIAutomation由于也是界面自动操作的技术,比直接使用keybd_event.GetWin ...

  4. Linux Ubuntu上手动安装.NET Core SDK

    今天重装了一台Linux服务器的Ubuntu 14.04系统,需要重新安装.NET Core 1.0. 按照官网上的文档用apt-get命令进行安装: sudo sh -c 'echo "d ...

  5. Python--过滤Mysql慢日志

    ##================================================================## 先来个笑话: 刚交的女朋友让我去他家玩,我觉得空手不好,于是告 ...

  6. 翻译-使用Spring WebService生成SOAP Web Service

    原文链接:http://spring.io/guides/gs/producing-web-service/ 生成SOAP web service 该指南将带领你使用Spring创建一个基于SOAP的 ...

  7. 线程池ThreadPool知识碎片和使用经验速记

    ThreadPool(线程池)大概的工作原理是,初始时线程池中创建了一些线程,当应用程序需要使用线程池中的线程进行工作,线程池将会分配一个线程,之后到来的请求,线程池都会尽量使用池中已有的这个线程进行 ...

  8. redis数据结构整理(二)

    摘要: 1.各个数据结构的应用举例 1.1 String类型应用举例 1.2List类型应用举例 1.3Set类型应用举例 1.4Sorted Set类型应用举例 1.5Hash类型应用举例 内容: ...

  9. EF架构~扩展一个分页处理大数据的方法

    回到目录 最近总遇到大数据的问题,一次性处理几千万数据不实际,所以,我们需要对大数据进行分块处理,或者叫分页处理,我在EF架构里曾经写过类似的,那是在进行BulkInsert时,对大数据批量插入时候用 ...

  10. Atitit.会员卡(包括银行卡)api的设计

    Atitit.会员卡(包括银行卡)api的设计 1. 银行卡的本质是一种商业机构会员卡1 2. 会员卡号结构组成1 2.1. ●前六位是:发行者标识代码 Issuer Identification N ...