關於JS中變量提升的規則和原理的一點理解(二)
阿新 • • 發佈:2018-01-21
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中變量提升的規則和原理的一點理解(二)