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


在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。


免責聲明!

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



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