下面看一個簡單的範例來說明問題
if (!("a" in window)) { var a = 1; } alert(a);
首先,所有的全域變數都是window的屬性,語句var a = 1;等價於window.a = 1;
你可以用以下方式來偵測全域變數是否宣告
"變數名稱" in window
第二,所有的變數宣告都在範圍作用域的頂部,看一下相似的範例:
複製程式碼 程式碼如下:
alert("a" in window); var a;
此時,儘管宣告是在alert之後,alert彈出的依然是true,這是因為JavaScript引擎首先會掃墓所有的變數聲明,然後將這些變數聲明移到頂部,最終的程式碼效果是這樣的:
var a; alert("a" in window);
第三,你需要理解該題目的意思是,變數宣告被提前了,但變數賦值沒有,因為這行程式碼包含了變數宣告和變數賦值。
你可以把語句拆分為如下程式碼:
var a; //声明 a = 1; //初始化赋值
所以總結起來就是當變數宣告和賦值在一起用的時候,JavaScript引擎會自動將它分成兩部以便將變數宣告提前,不將賦值的步驟提前是因為他有可能影響程式碼執行出不可預期的結果。
題目中的程式碼相當於:
var a; if (!("a" in window)) { a = 1; } alert(a);
根據上述例題的分析,宣告變數時如果是宣告的局部變數前面一定要加var,如果宣告的是全域變量可以不加var(最好限制全域變數的個數,盡量使用局部變數)
下面講述一個使用var的幾個特性
使用var語句多次聲明一個變數不僅是合法的,而且也不會造成任何錯誤。
如果重複使用的一個宣告有一個初始值,那麼它擔當的不過是一個賦值語句的角色。
如果重複使用的一個宣告沒有一個初始值,那麼它不會對原來存在的變數有任何的影響。
沒有var宣告的變量,是作為全域變數存在的;有var宣告的變量,屬於局部變量,尤其是在函數內部。並且,經過測試,帶var聲明比不帶var速度要快。函數內盡量多設局部變量,這樣即安全又快速,變量操作也更加合理,不會因為函數內胡亂操作全局變量而導致邏輯錯誤。
宣告物件時最好使用物件自面量的方式,這樣的速度相對new的方式要快很多。
變數名是自己取的,為了照顧語意和規範,變數名可能稍長,但注意了,變數名的長度也會影響程式碼的執行速度。長的變數名宣告的執行速度沒有短的快。
題目如下,問題是:2次alert分別輸出什麼結果?
<script type="text/javascript"> var a = 1; var a; alert(typeof a); (function () { b = '-----'; var b; })(); alert( typeof b); </script>
在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 = '-----';
var b;
第二題解析:b='-----',程式首先會去找上下文是否有變數b的聲明,如果有的話,直接賦值為'-----'。但是alert( typeof b); 是在函數外面,輸出的全域變數b,所有是undefined。
請注意:對變數的賦值操作並沒有提前。
以上是關於javascript變數聲明和定義變數var的不同理解和分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!