JavaScript作用域原理——预编译
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作用域原理——预编译的更多相关文章
- JavaScript作用域及预编译
几乎所有的编程语言都可以存储,访问,修改变量,那在JavaScript中这些变量放在那里?程序如何找到他们? js被归类于解释执行语言,但事实上他也是一门编译语言,因为他也要编译,但于传统的编译语言不 ...
- JavaScript作用域原理(二)——预编译
JavaScript是一种脚本语言, 它的执行过程, 是一种翻译执行的过程.并且JavaScript是有预编译过程的,在执行每一段脚本代码之前, 都会首先处理var关键字和function定义式(函数 ...
- JavaScript作用域原理(三)——作用域根据函数划分
一.一个for实例 <p id="scope3" style="color:red"></p> var pscope3 = docume ...
- JavaScript作用域原理(一)——作用域链
一.作用域的描述 JavaScript权威指南中对作用域有一句很精辟的描述:“JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里.” 在JavaScript中,作用域的 ...
- 转载:Javascript作用域原理
首先看一个例子: var name = 'laruence'; function echo() { alert(name); var name = 'eve'; alert(name); alert( ...
- javascript作用域原理
问题的提出 首先看一个例子: var name = 'laruence'; function echo() { alert(name); var name = 'eve'; alert(name); ...
- javaScript语言的预编译与运行
JS代码执行的过程: 1.预编译 ---- 事先对js代码做一个预处理 2.代码运行---开始执行JS代码. JS编程: 1.加载DOM的最好在/BODY之前 2.与DOM渲染无关的放在Head里面 ...
- javascript中的预编译问题
Js作为脚本语言,可以不需要编译直接运行,但遇到类似变量或者函数同名,预编译方面的知识可以帮助我们更好解决问题. 示例: 这是一段js中普通的函数调用代码 <script>1. // ...
- JS作用域和预编译(转载 学习中。。。)
JS在页面加载过程中顺序执行.但是分块预编译.执行. JS在执行前会进行类似”预编译”的操作,而且先预声明变量再预定义函数. 此时注意,是声明,不是定义,如:var a = 1; 在预编译中,只是执行 ...
随机推荐
- jquery 拦截 post 等请求实现aop效果
$(function(){ jQuery.extend({ put: function( url, data, callback, type ) { // shift arguments if dat ...
- jfinal渲染器FileRender完整路径文件不正确的问题
jfinal作者的建议如下: 完整分支的文件下载,可以使用那个带 File 参数的构造方法:FileRender(new File(完整路径)) 从而可以使用 renderFile(new File( ...
- Android AsyncTask 源代码分析
AsyncTask源代码分析 public abstract class AsyncTask<Params, Progress, Result> { //日志TAG private sta ...
- [R语言统计]频数表
频数表在统计学中是一个非常基本并且重要的概念,我们这里就来讲解它的基本用法. 首先我们需要载入数据,并查看数据的基本信息 install.packages('vcd') #安装vcd包,其中有可以利用 ...
- 15 +免费及收费的jQuery滚动插件
免费的 jQuery Scrolling 插件 Tiny Scrollbar SUPERSCROLLORAMA jScrollPane Curtain.js Plugin JQuery : Scrol ...
- 基于Dedup的数据打包技术
基于Dedup的数据打包技术 0.引言 Tar, winrar, winzip是最为常见的数据打包工具软件,它们把文件集体封装成一个单独的数据包,从而方便数据的分布.传输.归档以及持久保存等目的 ...
- Oracle 存储过程错误之PLS-00201: 必须声明标识符
转自:http://blog.csdn.net/u010678947/article/details/20702149 错误: ORA-06550: 第 1 行, 第 7 列: PLS-00201: ...
- 常用HQL(Hibernate Query Language)查询
查询一个对象(实体类必须有一个不带参数的构造方法) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @Test public void test01() ...
- 第二百八十六节,MySQL数据库-MySQL事务操作(回滚)
MySQL数据库-MySQL事务操作(回滚) 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性. 举例:有这样一张表 从表里可以看出张 ...
- (转)YV12 and NV12
用videoCapture和IAMStreamConfig拿到的支持的格式列表.发现支持2中图像格式,YV12和NV12.具体是怎么样的内存分布不知道.查了些文档.自己修改了几个图.看出了点端倪 YV ...