JavaScript之變量(聲明、解析、做用域)

聲明(建立) JavaScript 變量

在 JavaScript 中建立變量一般稱爲"聲明"變量。javascript

1、咱們使用 var 關鍵詞來聲明變量:java

var carname;

變量聲明以後,該變量是空的,其值其實是 undefined。函數

如需向變量賦值,請使用等號:this

carname="Volvo";

不過,您也能夠在聲明變量時對其賦值:spa

var carname="Volvo";
當使用var聲明一個變量時,建立的這個屬性是不可配置的,也就是說沒法經過delete運算符刪除
2、也可以使用let聲明,let容許你聲明一個做用域被限制在塊級中的變量、語句或者表達式。在Function中局部變量推薦使用let變量,避免變量名衝突。let 聲明的變量只在其聲明的塊或子塊中可用,這一點,與var類似。兩者之間最主要的區別在於var聲明的變量的做用域是整個封閉函數。
function varTest() {     var x = 1;     if (true) {         var x = 2; // 一樣的變量!         console.log(x); // 2     }     console.log(x); // 2 } function letTest() {     let x = 1;     if (true) {         let x = 2; // 不一樣的變量          console.log(x); // 2      }     console.log(x); // 1 }

從新聲明 JavaScript 變量

若是從新聲明 JavaScript 變量,該變量的值不會丟失:code

在如下兩條語句執行後,變量 carname 的值依然是 "Volvo":對象

var carname="Volvo";
var carname;

變量的解析

名字解析順序blog

javascript中一個名字(name)以四種方式進入做用域(scope),其優先級順序以下:
一、語言內置:全部的做用域中都有 this 和 arguments 關鍵字
二、形式參數:函數的參數在函數做用域中都是有效的
三、函數聲明:形如function foo() {}
四、變量聲明:形如var bar;ip

名字聲明的優先級如上所示,也就是說若是一個變量的名字與函數的名字相同,那麼函數的名字會覆蓋變量的名字,不管其在代碼中的順序如何。但名字的初始化倒是按其在代碼中書寫的順序進行的,不受以上優先級的影響作用域

變量的做用域

javascript是沒有塊級做用域的函數是JavaScript中惟一擁有自身做用域的結構。

var v = "hello" ;
if ( true ){
   console.log(v);
   var v = "world" ;
}
輸出結果爲:hello
修改以下:
var v = "hello" ;
( function (){
   console.log(v);
   var v = "world" ;
})();
輸出結果爲:undefined。由於在function做用域內,變量v的聲明被提高了

Javascript聲明變量的時候,雖然用var關鍵字聲明和不用關鍵字聲明,不少時候運行並無問題,可是這兩種方式仍是有區別的。

例一:

<script type="text/javascript">
var scope="global";  
function t(){  
    var scope;
    console.log(scope);  
    scope="local";
    console.log(scope);  
}  
t();
console.log(scope);
</script>

輸出結果爲:

總結:var聲明的變量在函數內部屬於局部變量,不會改變全局變量的值。

若是改成:

<script type="text/javascript">
var scope="global";  
function t(){
    console.log(scope);  
    scope="local";
    console.log(scope);  
}  
t();
console.log(scope);
</script>

那麼輸出結果變爲:

總結:沒有用var聲明的變量都是全局變量,並且是頂層對象的屬性。(變量提高只是聲明提高,賦值不會提高)

相關文章
相關標籤/搜索