如今推特上的问题,我们可以使用视频给出简单快捷提示或者指南,针对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)。
英文原稿:
小试牛刀,欢迎拍砖。