一旦引擎進入乙個作用域是,會先掃瞄該作用域內的定義語句
es5
var foo = 1;
(function(){
console.log(foo) ;//undefined
var foo = 2
函式在載入的時候會立即執行,這時候在函式的作用域內,由於有宣告foo的語句,故在函式的作用域內foo的值為2,並且是在console.log(foo)之後宣告的,根據宣告前置,函式中可以等價於
(function(){
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 標準中(一般情況下為嚴格模式)不允許變數(或者常量)在被定義之前被其他語句所讀取,以免出現邏輯性的錯誤。
es5 es6 繼承總結
一 原型鏈繼承 原型鏈繼承的原理 直接讓子類的原型物件指向父類例項,當子類例項找不到對應的屬性和方法時,就會往它的原型物件,也就是父類例項上找,從而實現對父類的屬性和方法的繼承。父類 function fat 父類上的原型方法 fat.prototype.getname function 子類 fu...
ES5 ES6 實現繼承
function parent value parent.prototype.getvalue function function child value child.prototype new parent const child new child 1 child.getvalue 1我們來研究...
ES5,ES6中的繼承
es5中的繼承 1,借助建構函式實現繼承 只能實現部分繼承 原理 通過call 函式改變this指向,將父類屬性掛載到子類例項中 function parent function child console.log new child 總結 優點 只呼叫一次父類的建構函式,避免了在子類原型中建立不必...