<script type="text/javascript"> var a = 1; function hehe() { window.alert(a); var a = 2; window.alert(a); } hehe(); </script>
執行結果以下所示:javascript
第一個alert:前端
第二個alert:java
這是一個使人詫異的結果,爲何第一個彈出框顯示的是undefined,而不是1呢?瀏覽器
一個頁面裏直接定義在script標籤下的變量是全局變量即屬於window對象的變量,按照javascript做用域鏈的原理,當一個變量在當前做用域下找不到該變量的定義,那麼javascript引擎就會沿着做用域鏈往上找直到在全局做用域裏查找。函數
首先這段程序涉及到了如下三個概念 執行環境 變量對象 做用域鏈 js的執行環境分全局的(瀏覽器的話就是window執行環境)和function執行環境,變量對象是用來保存執行環境下的變量和方法的,而做用域鏈上放着一個一個的變量對象造成一個鏈條。 這段代碼的執行過程應該是這樣的 首先進入全局執行環境 創建該執行環境下的變量對象A(保存有該執行環境下的x和一個匿名方法),再往下執行到匿名方法的執行環境 創建變量對象B(保存有該執行環境下的x),而js的當前執行環境的變量對象永遠放在做用域鏈的最前端,所在執行第一個alert(x), 就會找當前執行環境的變量對象B是否保存有x, 而事實上是有的,但alert(x)以前沒有給x賦值,所出獲得的結果就是undefined, 若是變量對象B中不存在x,那麼程序就會順着做用域鏈找上一個變量對象A裏是否有x. this
js的變量有兩種做用域:全局變量和局部變量。沒有使用 var 聲明的變量和在function以外聲明的變量都是全局變量,是window屬性之一;使用 var 聲明的變量屬於所在函數,無論在函數的哪一個位置出現,等價於在函數一開始聲明。局部變量比同名全局變量的優先級高,因此局部變量會隱藏同名的全局變量。要想訪問被隱藏的全局變量就加上 window. 前綴。
js沒有塊做用域,在語句塊以後,在函數結束以前,語句塊定義的變量都是能夠訪問的。好比:for(var idx =0; idx<2;idx++){} alert(idx); 結果顯示爲2。spa
上段代碼至關於對象
var x=1; function (){ var x; alert(x); x=1212; alert(x); }
正確代碼:第一次要this.x blog
<script type="text/javascript"> var a = 1; function hehe() { window.alert(this.a); var a = 2; window.alert(a); } hehe(); </script>