当前位置:嗨网首页>书籍在线阅读

03-变量提升

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

2.2 变量提升

在 JavaScript 中,当变量被声明时,声明会被提升到它所在函数的顶部,并被赋予undefined值。这就使得在函数的任意位置声明的变量存在于整个函数中,尽管在赋值之前,它的值一直为undefined,如图2-2所示。

figure_0048_0033.jpg JavaScript引擎并没有重写代码:每次调用函数时,声明都会重新提升

figure_0048_0034.jpg 作为和图中代码的对比,我们尝试访问一个没有在局部或者全局声明过的变量,这会导致JavaScript运行时错误,JavaScript代码会停止在语句执行的地方:

figure_0048_0035.jpg 因为变量声明总是被提升到函数作用域的顶部,所以在函数的顶部声明变量总是最好的做法,更好的是使用单个var语句。这和JavaScript的做法是一致的,避免了我们在前面的图中所演示的那种困惑。

figure_0048_0036.jpg 这种作用域和提升行为,有时结合在一起时会引起某些惊人的表现。请看下面的代码:

figure_0049_0037.jpg 执行prison函数时,console.log()请求输出regular_joe,JavaScript引擎首先在局部作用域内检查 regular_joe是否已被声明。由于 regular_joe未在局部作用域内声明,然后JavaScript引擎检查全局作用域,找到了它的定义并返回了它的值。这叫沿着作用域链往上查找。但是如果变量在局部作用域内也声明了呢?

figure_0049_0038.jpg 这是否违反直觉或者令人困惑?我们来看一下JavaScript在底层处理提升的方式。