ES5和ES6中的变量声明提升
生活随笔
收集整理的這篇文章主要介紹了
ES5和ES6中的变量声明提升
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
ES5和ES6中的變量聲明提升
Example1:
a=2; var a; console.log( a ); //結果為2Example2:
console.log( a ); //結果是undefined var a=2;Example2:
foo(); //結果是1 var foo; foo = function() { console.log( 2 ); }; function foo() { console.log( 1 ); }原理解讀:瀏覽器引擎在運行程序分為兩個階段:第一個的階段是編譯階段,該階段負責找出代碼中所有的定義聲明(包括變量和函數),并關聯到合適的作用域中;第二階段是執行階段,該階段負責找出代碼中的所有賦值聲明,并在作用域找找到第一階段的定義聲明,以供使用。
代碼解讀:
第一個例子在編譯階段會將var a;這句定義聲明首先解讀關聯到全局作用域中,所以當在賦值聲明階段執行a=2;和console.log(a);這兩個賦值聲明的代碼時是正常執行的,也就有了定義聲明提前了的感覺。
第二個例子也同樣是第一階段先解讀了var a,這部分定義聲明,接著在第二階段的時候執行console.log(a);的時候報undefined,說明雖然定義聲明雖然提前了,可是賦值聲明a=2;這部分仍然未提前。
第三個例子在編譯階段會將 var foo;變量定義聲明和 function foo(){...}函數定義聲明提前,然后在第二階段執行foo();賦值聲明,這里需要注意的是在這種變量和函數重復聲明的情況,函數定義申明會被提更前,原因倒不是真的是提前了,而只是在賦值聲明的時候首先會去方法域中尋找,而后才去變量域中尋找,所以導致看起來是函數申明比變量聲明更提前了。
結論:對于JS中所說的變量聲明提前,更準確的說法是變量定義聲明提前了,更準確的理解是定義聲明處于程序運行的第一個階段導致相較于賦值聲明的第二階段有了前提的效果。
總結
以上是生活随笔為你收集整理的ES5和ES6中的变量声明提升的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery插件素材网站
- 下一篇: C++ Socket 实例