當前位置:
                    首頁 >
                            前端技术
>                            javascript
>内容正文                
                        
                    javascript
javascript耐人寻味
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                javascript耐人寻味
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                在思考javascript解釋過程的時候,看過別人幾篇文章,自己做了幾個測試
? ?
容易理解,在javascript,形如這樣的代碼可以正常執行:
?
alert(hello()); function hello(){alert('hello'); }?
可以得到“hello”字符串。
形如這樣的代碼,有問題。
alert(hello());var hello = function(){alert('hello');}?
結果為undefined。兩種代碼執行結果不同的原因是,在javascript執行之前有個預解釋階段,形如function name()方式定義的函數會優先賦值,就是說第一遍name變量就已經指向相應函數了,所以第一段代碼在解釋階段可以訪問到后面的hello函數,第二段代碼中,則還要講到,預解釋階段創建一個活動對象,然后在這個對象里把變量丟進
去,而這種定義函數的方式會然解釋器認為hello是一個變量,所以,給他們賦值為undefined,第二段代碼實際是以變量的形式保存了hello的值為undefined,故執行階段時它還是允許了undefined,它在后面才得到函數定義。 當然,html的執行順序是從上到下執行,那么嵌套在,<script></script>也應該是從上到下一塊一塊執行,即使是外鏈接的javascript代
碼也不例外。 接下來是這一段代碼 function hello(){alert('hello');}hello();var hello = function () {alert('hello2')}hello();
你可以想象上面的解釋,然后想象結果。
結果和預想的一樣,“hello”,“hello2”。怎么樣,是不是有點糊涂了,之前我們把hello放前面,所以執行到前面的hello時是undefined,首先,看上面代碼,預解釋階段,本應該報錯的第一個hello正常執行,說明了給hello定義undefined在預解釋階段應該是在函數定義之前 然后是這一段,結果是什么呢,需要思考下了 function hello(){alert('hello');}hello();function hello() {alert('hello2')}hello();
?
兩次都是hello2而不是hello和hello2,結合前面的,可以理解,在預編譯階段已經把hello重新賦值,并且第二次遇見function hello()會忽略,或者說是直接提前了,總而言之,以上代碼實際上執行順序是
function hello(){alert('hello');}hello = function() {alert('hello2')} hello();hello();?
就是這樣,然后我們在看兩段代碼,第一段比較簡單是這樣: <script type="text/javascript">function hello(){alert('hello');}hello();</script><script type="text/javascript">function hello() {alert('hello2')}hello();</script>?
得到預想結果,hello 和hello2,不同就是拆成了兩塊,而代碼是一塊一塊執行的。前面已經提到。 然后下面這一段需要深入仔細的看看,和思考哈哈。 <script type="text/javascript">var hello = function () {alert('hello');}hello();function hello() {alert('hello2')}hello();</script>?
先不說結果,猜猜是什么結果,是不是有人會以為第二次從新賦值,結果不是和那一段代碼一樣嗎,錯了,兩次都是hello,是前面的那個函數的值,原因其實很簡單function hello()提前了,所以實際上是第一個函數覆蓋了第二個函數。
修改了一點東西,同時附上之前看到鏈接,其實,現在看看,這東西還是有點怪怪,不過它還是挺重要,怎么說,至少要知道其實js解釋分兩次,有這感覺這對寫代碼時候是很有幫助:
參考:http://www.jb51.net/article/44123.htm
轉載于:https://www.cnblogs.com/wuweixin/p/4825934.html
總結
以上是生活随笔為你收集整理的javascript耐人寻味的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Java 设计模式(3)单例模式
- 下一篇: Android 获取信号强度
