1. 程式人生 > >關於JS中變量提升的規則和原理的一點理解(二)

關於JS中變量提升的規則和原理的一點理解(二)

cnblogs 打印 blog javascrip 誤區 down mark fun ont

上篇文章中講到變量提升和函數提升的先後順序時蒙了,後來去查了一下資料,特別整理一下。

在《你不知道的JavaScript(上卷)》一書的第40頁中寫到:函數會首先被提升,然後才是變量

書中的一個代碼示例是:

foo(); //1
var foo;
function foo() {
    console.log(1);
}   
foo = function() {
    console.log(2);
}

這個例子相對比較好理解,就是foo這個函數會先被聲明再作用域的開始部分,實際上這個代碼片段會被引擎理解為如下形式:

function foo() {
    console.log(1);
}
foo(); //1
foo = function() {
    console.log(2);
}

可是,當在網上看到這個一個例子時一開始我也是對運行結果不太理解的:

console.log(foo);    // function foo(){...}
function foo(){
    console.log("函數聲明");
}
var foo = "變量";

咋一看這段代碼輸出的應該是undefined啊,因為根據規則是先提升函數,然後才是變量,所以不應該是這樣嗎?

function foo(){
    console.log("函數聲明");
}
var foo = undefined;

這個理解最大的一個誤區在於變量提升時只是聲明了變量,並沒有賦值,也就是

var foo;

僅此而已!我們平時在這種聲明之前打印變量之所以是undefined是因為只是聲明了,其他地方並沒有賦值,所以是undefined,像這樣的:

console.log(wanc);  //undefined
var wanc = ‘66‘;

可是在上面的例子中,變量和函數都是存在的,而且是先提升的函數foo,然後是聲明變量var foo;聲明變量的過程中並沒有改變變量的值,所以最上面打印的還是函數foo;

由此一個小問題引出的思考:有問題就要多查資料,包括網上的和書上的,對比不同人的理解,最終的目的就是要做到知其然並且知其所以然,加油!

參考資料:

  • http://bbs.csdn.net/topics/392018835
  • 《你不知道的JavaScript(上)》

關於JS中變量提升的規則和原理的一點理解(二)