在JS里的全局環境就是一個對象,這個對象也是JS運行的根,對瀏覽器中的JS,這個對象就是window對象。對全局JS語句來說,window對象就相當於當前作用域。
當我們寫下:
var MyJs='Start';
就是定義了window作用域的一個變量MyJs,當我們這樣寫:
MyJs='Start';
就是定義了window作用域的一個屬性MyJs。
從上面看,window作用域的一個變量MyJs與window作用域的一個屬性MyJs幾乎等價,對於全局的js語句來說加var與不加沒什么區別,但在函數體內的語句加與不加就有區別了。
<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。