实例讲解js中的预编译

js作为一本脚本语言,可以不经过编译直接运行,但遇到预编译的问题,尤其是变量或函数同名时,这点知识就尤其必要了。为了更好地了解js语言背后的运行机理。笔者采用实例化的方式讲解我理解的预编译。

   理解预编译首先要弄清楚两种概念:函数声明和变量赋值。

function ledi(){ }//函数声明

这种形式的写法是函数声明,即声明一个函数,脚本在执行之前会做预编译处理。

var ledi= function(){ }//变量赋值

  这种写法是变量赋值,函数在js语言里也是一种数据,匿名函数作为变量赋值给定义的变量。这种形式在预编译处理阶段,只会给变量ledi分配一个内存空间,不会做初始化。初始化过程中会在执行时执行。

   好了,弄清楚以上概念,上实例。实例参考(点击此处)。原作者只详细解释了前两个实例,而笔者看来,接着的两个也非常重要,那么笔者就甄别出代表性来讲解。

示例代码一:

function ledi(){
alert(‘ledi1‘);
}; 

ledi();
function ledi(){
alert(‘ledi2‘);
};
ledi();

这段代码,首先判断两个都属于函数声明。都会在预编译阶段处理,而函数名相同,会按后定义的来定义函数,在执行阶段只会看到后定义的函数结果,也就不难理解了。

示例代码二:

var ledi = function(){alert(‘ledi1‘);};
ledi();
ledi = function(){alert(‘ledi2‘);};
ledi(); 

  这段代码,首先判断两种都属于变量赋值。在预编译阶段,两个变量名一样,分配一个内存空间存放变量ledi内容。当代码执行时,按照顺序执行和赋值,会先后得到两种结果。

示例代码三:

function ledi(){alert(‘ledi1‘);};
ledi();
ledi = function (){alert(‘ledi2‘);};
ledi(); 

这段代码,首先判断,前一种属于函数声明,后一种属于变量赋值。预编译处理完,首先执行第二行,实际上是第一行的内容,第三行相当于将ledi变量重新赋值即初始化,重新赋值后,第四行执行第三行的函数。

示例代码四:

window.alert(ledi);
function ledi(){
}
//这四行代码分开执行
window.alert(ledi);
var ledi = 123;

  以上代码分开执行,可验证,函数预编译会执行,变量赋值则是先分配空间,执行时再赋值。

实例讲解js中的预编译,布布扣,bubuko.com

时间: 2024-11-18 09:07:28

实例讲解js中的预编译的相关文章

JS中的预编译(词法分析)阶段和执行阶段

javascript相对于其它语言来说是一种弱类型的语言,在其它如java语言中,程序的执行需要有编译的阶段,而在javascript中也有类似的“预编译阶段”(javascript的预编译是以代码块为范围<script></script>,即每遇到一个代码块都会进行  预编译>执行),了解javascript引擎的执行机理,将有助于在写js代码过程中的思路总结 首先科普下javascript中的两种声明方式,var和function,前者声明的是变量,后者声明的是方法 在预

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

JS在页面加载过程中顺序执行.但是分块预编译.执行. JS在执行前会进行类似”预编译”的操作,而且先预声明变量再预定义函数. 此时注意,是声明,不是定义,如:var a = 1; 在预编译中,只是执行了”var a”没有赋值,即在预编译结束时a 为undefined. (注意)并不是先全文编译完在执行,而是块编译,即一个script块中,预编译再执行,然后(按顺序)下一个script块,预编译再执行,但此时上一个块中的数据都是可以用的,但下一个块中的函数,声明的变量都是不可用的. 变量没声明就引

iOS中的预编译指令的初步探究

看到非常好的两篇技术文,转来方便自己查看. 转自:http://www.cnblogs.com/daiweilai/p/4234336.html 开篇 我们人类创造东西的时候有个词叫做”仿生学“!人类创造什么东西都会模仿自己来创造,所以上帝没有长成树的样子而和人长得一样,科幻片里面外星人也像人一样有眼睛有鼻子……但是人类自己创造的东西如果太像自己,自己又会吓尿(恐怖谷效应),人类真是奇葩:奇葩的我们在20世纪创造了改变世界的东西——计算机(电脑),不用怀疑,这货当然也是仿生学!这货哪里长得像人了

C/C++中的预编译指令

工作中遇到的: 一个头文件中的: #pragma warning(disable:4996)#pragma warning(disable:4244)#pragma warning(disable:4267) 不理解意思,遂查? C/C++中的预编译指令 程序的编译过程可以分为预处理.编译.汇编三部分,其中预处理是首先执行的过程,预处理过程扫描程序源代码,对其进行初步的转换,产生新的源代码提供给编译器.预处理过程读入源代码之后,会检查代码里包含的预处理指令,完成诸如包含其他源文件.定义宏.根据条

C#中的预编译指令介绍

原文:C#中的预编译指令介绍 1.#define和#undef 用法: #define DEBUG #undef DEBUG #define告诉编译器,我定义了一个DEBUG的一个符号,他类似一个变量,但是它没有具体的值,可以将它看为一个符号而已.#undef就是删除这个符号的定义.如果符号DEBUG没定义过,则#undef不起作用,否则#define不起作用.二者都必须放在源代码之前.二者的顺序看代码的顺序: #define DEBUG #undef  DEBUG 这样的话,DEBUG是没有定

iOS中的预编译指令

iOS中的预编译指令的初步探究 目录[+] 开篇 我们人类创造东西的时候有个词叫做”仿生学“!人类创造什么东西都会模仿自己来创造,所以上帝没有长成树的样子而和人长得一样,科幻片里面外星人也像人一样有眼睛有鼻子……但是人类自己创造的东西如果太像自己,自己又会吓尿(恐怖谷效应),人类真是奇葩:奇葩的我们在20世纪创造了改变世界的东西——计算机(电脑),不用怀疑,这货当然也是仿生学!这货哪里长得像人了??别不服,先听我说完,先把你的砖头放下.狭义的仿生学是外形上仿生嘛,其实广义上仿生学还可以原理的仿生

js - 基础 之 预编译总结

js运行步骤 语法解析(检查有无语法错误) 预编译 解释运行(将 js 翻译成计算机识别的语言(0.1组成),翻译一行执行一行) 预编译 [全局]: 创建 GO( Grobal Object ) 对象 找变量声明 找函数声明 [函数]: 创建 AO( Activation Object ) 对象(执行上下文): 找形参和变量声明,将形参和变量名作为 AO 对象的属性名,值为 undefined(有重复的名称只写一个即可): 将形参与实参值统一(用实参的值替换 undefined): 在函数体中找

JS中的预解释

1.什么是预解释? 在当前作用域下,JS代码执行之前,首先会把带var/function关键字的进行提前的声明(declare)或者定义(defined). 2.预解释是如何操作的? a.带var关键字的在预解释阶段只完成了提前的声明:b.带function关键字的在预解释阶段完成了声明和定义两个操作. 3.预解释的注意点? a.不管条件判断是否成立,判断体中的内容都要进行预解释: 例如:if (!('a' in window)) { var a=12;  //判断'a'是否为window的一个

再次讲解js中的回收机制是怎么一回事。

在前几天的一篇闭包文章中我们简单的介绍了一下闭包,但是并没有深入的讲解,因为闭包涉及的知识点比较多,为了能够更好的理解闭包,今天讲解一下关于js中的回收机制. 在初识闭包一文中我说过js中有回收机制这么一回事,让我们一起回顾一下,并且深入的了解js中的回收机制到底是怎么一回事. function a(){ var num = 10; return function(){ num ++; console.log(num); } } a()(); //11 a()(); //11 按理说第二次执行函