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,分别输出不同的内容,后一个没有将前面一个的内容覆盖掉。

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

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

  1. JavaScript作用域及预编译

    几乎所有的编程语言都可以存储,访问,修改变量,那在JavaScript中这些变量放在那里?程序如何找到他们? js被归类于解释执行语言,但事实上他也是一门编译语言,因为他也要编译,但于传统的编译语言不 ...

  2. JavaScript作用域原理(二)——预编译

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

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

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

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

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

  5. 转载:Javascript作用域原理

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

  6. javascript作用域原理

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

  7. javaScript语言的预编译与运行

    JS代码执行的过程: 1.预编译 ---- 事先对js代码做一个预处理 2.代码运行---开始执行JS代码. JS编程: 1.加载DOM的最好在/BODY之前 2.与DOM渲染无关的放在Head里面 ...

  8. javascript中的预编译问题

    Js作为脚本语言,可以不需要编译直接运行,但遇到类似变量或者函数同名,预编译方面的知识可以帮助我们更好解决问题. 示例: 这是一段js中普通的函数调用代码 <script>1.    // ...

  9. JS作用域和预编译(转载 学习中。。。)

    JS在页面加载过程中顺序执行.但是分块预编译.执行. JS在执行前会进行类似”预编译”的操作,而且先预声明变量再预定义函数. 此时注意,是声明,不是定义,如:var a = 1; 在预编译中,只是执行 ...

随机推荐

  1. SSH高级应用(端口转发)

    转发自:http://www.cnblogs.com/sting2me/p/5167730.html 基于SSH协议的端口转发 [前言] 最近一直在使用ssh协议的端口转发(隧道)功能,完成对内网空透 ...

  2. 用Lucene对文档进行索引搜索

    问题 现在给出很多份文档,现在对某个搜索词感兴趣,想找到相关的文档. 简单搜索 一种简单粗暴的做法是: 1.读取每个文档:2.找到其中含有搜索词的文档:3.对找到的文档中搜索词出现的次数统计:4.根据 ...

  3. Postgres数据库备份与还原命令

    备份 pg_dump.exe -c -b -E UTF8 -U postgres -h 127.0.0.1 -p 5432 -f "f:\testdb001.bak" testdb ...

  4. 打开wps的宏设置,提示你可能没有装vba

    打开wps的宏设置,提示你可能没有装vba?? 因为wps个人版没有vba,安装以下软件即可,亲测可行 VBA6.3提取自WPS2012专业增强版.zip   链接: http://pan.baidu ...

  5. 关于trunk、access以及hybrid的一些简单知识

    关于trunk.access以及hybrid的一些简单知识:Access 类型的端口只能属于 1 个 VLAN ,一般用于连接计算机的端口: Trunk 类型的端口可以允许多个 VLAN 通过,可以接 ...

  6. Hive UDF IP解析(一):依赖包兼容性问题

    Java依赖环境: <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-e ...

  7. Java学习理解路线图

    信息来自知乎网友 学习截图:来自开源力量

  8. sql server拼接一列字段

    有一表,名曰IPSlot,欲取IP整列字段. sql语句,利用sql server的xml auto将表数据转换成xml=> select name= STUFF( REPLACE( REPLA ...

  9. eclipse新建python项Project interpreter not specified

    安装好pydev后新建python项目时提示”Project interpreter not specified“的错误,这是因为没有导入python开发环境所致 解决方法如下:1.找到eclipse ...

  10. div 边框

    1.四个边框border-left 设置左边框,一般单独设置左边框样式使用border-right 设置右边框,一般单独设置右边框样式使用border-top 设置上边框,一般单独设置上边框样式使用b ...