如今推特上的问题,我们可以使用视频给出简单快捷提示或者指南,针对javascript提升解析呢;它是什么,怎么工作的;关于它,我们需要了解一些什么?所有的这些问题都讲包含在这一篇初学者的基础教程中。

提升解析

看下面这段代码:

varmyvar = 'my value'; alert(myvar); // my value

好,很简单,弹出框会显示“my value”;这是很明显;然后呢,我们一起接着往下走,现在我们创建一个可以提示相同值的立即执行的函数。

varmyvar= 'my value';   (function() {   alert(myvar); // my value })();

OK,依旧很明显;现在,举一个混合的例子;我们在上面这个匿名函数中,创建一个名字相同的局部变量。

varmyvar= 'my value';   (function() {   alert(myvar); // undefined   varmyvar= 'local value'; })();

    啊,为什么现在提示框显示未定义(undefined)?尽管,我们声明一个新的变量,它仍然位于alert下面,所以它不应该生效,对不对?很抱歉,你错了。

变量声明提升

在当前的作用域中,不管变量在哪里被声明;在javascript的内部实现中,都将被提升;然而需要注意的是,只有声明会被提升。一个变量如果在声明时,同时被初始化一个当前的值;在最初被提升时,仍然是未定义(undefined)。

    好,现在我们来解释一下声明初始化这个两个术语之间的区别。假设有如下一行代码:

var joe = 'plumber';

那么声明和初始化应该是这样的

声明

var joe; // the declaration

初始化

joe = 'plumber'; // the initialization

现在理解了术语,那么,我们就可以很容易的明白浏览器内部做了什么;看如下的伪代码:

(function() {   vara ='a';   // lines of code   varb ='b';   // more lines of code   varc='c'; // antipattern   // final lines of scripting })();

请注意,上面这个声明变量的方式其实被认为是糟糕的实践(所有变量的声明建议放在顶部);然而,在浏览器的背后,所以的变量声明无论出现在那个函数的作用域中,都将被提升到顶部;就像下面一样:

(function() {   vara,b, c; // variables declared   a = 'a';   // lines of code   b = 'b'; // initialized   // more lines of code   c= 'c'; // initialized   // final lines of scripting })();

如果,我们现在回到最开始那段令人费解的未定义(undefined)的代码;代码如下:

varmyvar= 'my value';   (function() {   alert(myvar); // undefined   varmyvar= 'local value'; })();

现在应该非常清楚,为什么myvar提示未定义(undefined);正如,我们前面得到的结论;一旦一个局部变量被声明;它将自动被提升到函数的作用域的顶端在被alert之前;最终就是,在alert之前这个变量已经被声明;但是由于,初始化没有被同时提升;所以变量的值就是未定义(undefined)。

英文原稿

    小试牛刀,欢迎拍砖。