1. 程式人生 > >js作用域及var與無var的區別

js作用域及var與無var的區別

在JS裡的全域性環境就是一個物件,這個物件也是JS執行的根,對瀏覽器中的JS,這個物件就是window物件。對全域性JS語句來說,window物件就相當於當前作用域。

當我們寫下:

1

var MyJs='Start';

 就是定義了window作用域的一個變數MyJs,當我們這樣寫:

1

MyJs='Start';

 就是定義了window作用域的一個屬性MyJs。

從上面看,window作用域的一個變數MyJs與window作用域的一個屬性MyJs幾乎等價,對於全域性的js語句來說加var與不加沒什麼區別,但在函式體內的語句加與不加就有區別了。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<script language="javascript" type="text/javascript">

    var MyLike = 'C#';

    YouLike = 'C++';

    alert('我喜歡:' + MyLike + " 你喜歡:" + YouLike);

    //輸出:我喜歡:C# 你喜歡:C++

    ChangeLike();

    function ChangeLike() {

 

        alert(MyLike + '是我喜歡 ' + YouLike + '是你喜歡'); //undefined是我喜歡 C++是你喜歡

        

var MyLike = 'JS';

        YouLike = 'JAVA';

        alert(MyLike + '是我喜歡 ' + YouLike + '是你喜歡')//JS是我喜歡 JAVA是你喜歡

    }

    alert(MyLike + '是我喜歡 ' + YouLike + '是你喜歡')//C#是我喜歡 JAVA是你喜歡

</script>

 

 從上面我們可以看出有var 修飾的在函式內外表現出兩個東西,沒有var修飾的只表現出一個東西,它的值函式內外都可以改變。上面有個undefined大家應該會覺得很奇怪,為什麼不是C#。上面說過,在JS全域性語句中有var 的就是一個變數,沒有的就是一個屬性。變數是有作用域的,程式碼進去下面的函式中,就相當於在當前作用域中建立了一個子作用域。JS引擎首先會把自定義函式建立為作用域上的變數函式,對所有的var 定義的變數,預編譯的時候都會定義為undefined,JS遇到變數和函式時會首先在當前作用域找,沒找到再往上層找,而var MyLike = 'JS';說明已經存在,初始值定義為undefined,var MyLike = 'JS'賦值在輸出的後面,所以為undefined。