当前位置: 首页 > 科技观察

什么是Javascript提升?

时间:2023-03-12 21:17:26 科技观察

Javascript是一门容易被误解的语言,但它的强大是毋庸置疑的。个人认为,要想深入理解Javascript语言,首先必须真正理解它的基本概念(如:Scope、Closure、Hoisting等)。今天想通过自己的理解来解释一下JavascriptHoisting(国内一般译为变量提升):  在解释JavascriptHoisting之前,先来看几段代码:1//代码段1--------------------------2varmyvar='变量值';3控制台日志(myvar);//变量值4//代码段2-----------------------5varmyvar='variablevalue';6(function(){7console.log(myvar);//变量值8})();9//代码段3----------------------------10varmyvar='变量值';11(function(){12console.log(myvar);//未定义13varmyvar='内部变量值';14})();  代码段1会在控制台打印出变量值,很容易理解;代码段2也会在控制台打印出变量值。Javascript编译器首先检查变量myvar是否声明在匿名函数的内部作用域(Scope)中。myvar,发现存在,即打印出myvar在这个范围内的值。但是代码段3只是代码段2的微调,却输出undefine!!!  理解代码段3之前,首先要理解JavascriptHoisting的概念。Javascript提升:在javascript中,每个变量声明都被提升到其声明上下文的顶部。我的理解是,在Javascript语言中,变量的声明(不包括变量初始化)会被提升(topped)到声明所在的上下文中,也就是说,在变量的范围内,不管变量在哪里声明后,它将被提升到作用域的顶部,但变量初始化的顺序保持不变。下图左右的代码输出结构是一样的。当左边的代码段在JS中执行时,实际的执行顺序如右边的代码所示(JS编译器会提升变量声明)。  理解了提升的概念后,回到开头对代码段3的理解。代码段3和托管后的代码如下图所示:  两个输出结构都未定义!可以这样理解,内部变量myvar是在匿名函数的最后一行声明和赋值的,但是JS解释器会将变量声明(不包括赋值)提升到匿名函数的第一行(top),因为myvar变量只是声明的,console.log(myvar)语句执行时myvar没有赋值,所以JS输出undefined。  如果变量声明没有被提升(Hositing)到顶部,应该报错。如下图所示: 这里有一道试题,看你是否理解Hospitaling的概念:1//测试代码----------------------2varmyvar='变量值';3(function(){4console.log(myvar);//?5myvar='内部变量值';6})();  这个片段应该输出什么值?答案是变量值。