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;
以上代码分开执行,可验证,函数预编译会执行,变量赋值则是先分配空间,执行时再赋值。