JavaScript變量聲明提前


上周四吃完午飯,leader發了一道JavaScript的題目給我們做,我們Team里面有做前端的,有做后台的,也有做mobile web的,所以大家對題目的理解各自都不一樣,然后在QQ討論組里面進行討論。發現雖然很基礎,但是通過討論收獲不少。當然在有開發經驗的開發者看來,這些都是學習JavaScript最基礎的東西。自己因為平時都是用jQuery或者第三JS組件,所以對JavaScript基礎學習不夠重視。

題目如下:請寫出下面代碼2次alert分別輸出什么結果?

<script type="text/javascript">

var a = 1; var a; alert(typeof a); (function () { b = 'hello world'; var b; })(); alert( typeof b); </script>

我的答案是:1.undefined 2.undefined。然后leader讓我們再仔細考慮一下問題答案。我對題目的分析:1.聲明a並賦值為1,然后用重新聲明a,但是此時沒有賦值,那變量聲明了,但是未賦值,所以是undefined。2.第一行的b變量是在函數里面是全局變量,然后聲明了一個局部變量,但是沒有賦值。alert里面輸出的是全局變量b,所以也是undefiend。

 
        

我自己在Chrome里面運行了一下代碼,代碼正確結果是1.number 2.undefined。這里考察的是JavaScript的變量聲明提前概念。 

test(); function test(){ alert("Hello World!"); }

運行結果是:Hello World!。原理:計算機在開始執行語句之前,會先查找所有的function定義,然后保存相關的function。

分析結果:

第1題:var a = 1; var a;

第2行聲明變量a,就相當於在頂部聲明了a,然后第一句是重新聲明a,然后賦值為1。所以typeof a為number

第2題:b = 'hello world'; var b;

 
        

第二題解析:b='hello world',程序首先會在函數內部去查找是否有變量b的聲明,如果有的話,直接賦值為'hello world'。但是alert( typeof b); 是在函數外面,輸出的全局變量b,所有是undefined。

 
        
 
        

接着看如下代碼段:

 

<script type="text/javascript"> name = "aaa"; function test() { alert(typeof name); var name = "bbb"; alert(typeof name); } test(); </script>

請寫出結果。

分析可以寫成如下代碼段:

myname = "aaa"; function test() { alert(typeof myname); //在函數內部查找是否有myname的聲明,有聲明,但未賦值。所以typeof myname為undefined
  var myname=123;//賦值操作 
  alert(typeof myname);//number
} test();

 

但是下面代碼段,運行結果是什么?

<script type="text/javascript"> alert(typeof name); var name = "hello world"; alert(typeof name); </script>

 

 
        

程序運行結果是:string,string。原因是什么?

 

注意:通過和園友的共同討論,有了結果了。關於最后出現string和string的結果,確實是因為Chrome瀏覽器默認給name賦值了name="",所以輸出的結果為string。這里給大家提醒了一下,在前端開發過程中,我們很多時候都在關注CSS和HTML的在各個瀏覽器中的兼容器,但是有時JavaScript在各個瀏覽器中也有兼容性問題。

 
        
 
         
         
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM