一旦引擎進入一個做用域是,會先掃描該做用域內的定義語句編程
ES5 函數
var foo = 1;作用域
(function(){io
console.log(foo) ;//undefinedconsole
var foo = 2function
})();變量
函數在加載的時候會當即執行,這時候在函數的做用域內,因爲有聲明foo的語句,故在函數的做用域內foo的值爲2,而且是在console.log(foo)以後聲明的,根據聲明前置,函數中能夠等價於 co
(function(){ let
var foo ;錯誤
console.log(foo) ;//undefined
foo = 2
})();
故console.log(foo)打印出來的是undefined
固然,若是函數中不聲明foo的話,那麼函數中打印的foo就應該是全局變量中的 foo, 也就是 1
ES6
對於這種不是很符合編程邏輯的行爲,ES6 的let 和const 中,引擎將這種行爲直接視爲錯誤處理
let foo = 1;
(function(){
console.log(foo) ;//ReferenceError: foo is not defined
let foo = 2
})();
ES6 標準中(通常狀況下爲嚴格模式)不容許變量(或者常量)在被定義以前被其餘語句所讀取,以避免出現邏輯性的錯誤。