js 變量聲明 (var使用與不使用的區別)


js 變量聲明 (var使用與不使用的區別)

一、總結

一句話總結:不使用var聲明變量的時候,變量是全局對象(window對象)屬性,在全局中使用var聲明變量是全局變量

var 全局變量 局部變量
不使用 var 全局對象屬性

 

1、js變量作用域有哪兩種?

全局 函數

全局作用域

函數作用域:函數作用域中無法訪問全局變量

 

2、使用一個沒有聲明的變量的時候,js什么時候會報錯,什么時候隱式聲明?

訪問 報錯
賦值 隱式聲明

當我們使用訪問一個沒有聲明的變量時,JS會報錯;而當我們給一個沒有聲明的變量賦值時,JS不會報錯,相反它會認為我們是要隱式聲明一個全局變量,這一點一定要注意。

 

3、不使用var聲明變量的時候,變量是全局對象(window對象)屬性,在全局中使用var聲明變量是全局變量,那么全局對象屬性和全局變量的區別是什么?

var 全局變量 不可 delete運算符 刪除
全局對象屬性 可 刪除

事實上,Javascript的變量聲明、創建屬性以及每個Javascript中的每個屬性都有一定的標志說明它們的屬性----如只讀(ReadOnly)不可枚舉(DontEnum)不可刪除(DontDelete)等等。

由於變量聲明自帶不可刪除屬性,比較var name = 'muzidigbig' 跟 name = 'muzidigbig'

,前者是變量聲明,帶不可刪除屬性,因此無法被刪除;后者為全局變量的一個屬性,因此可以從全局變量中刪除。

 

當使用var聲明一個變量時,創建的這個屬性是不可配置的,也就是說無法通過delete運算符刪除

var name=1 ->不可刪除

sex=”girl“ ->可刪除

this.age=22 ->可刪除

 

4、js賦值操作的實質是什么?

查找 解析 賦值
window 屬性 賦值

而事實上是對屬性賦值操作。首先,它會嘗試在當前作用域鏈(如在方法中聲明,則當前作用域鏈代表全局作用域和方法局部作用域)中解析 name; 如果在任何當前作用域鏈中找到name,則會執行對name屬性賦值; 如果沒有找到name,它才會在全局對象(即當前作用域鏈的最頂層對象,如window對象)中創造name屬性並賦值。

注意!它並不是聲明了一個全局變量,而是創建了一個全局對象的屬性。

 

5、使用var聲明變量時,生成變量的兩種情況?

函數 全局

在當前域中聲明變量.

如果在方法中聲明,則為局部變量(local variable);

如果是在全局域中聲明,則為全局變量。

 

6、js創建的變量常見的有哪三種?

局部 全局 全局對象屬性

局部變量:函數內 var定義的變量

全局變量:全局 var 定義的變量

全局對象屬性:隱式聲明的變量

 

 

 

 

二、js 變量聲明 (var使用與不使用的區別)

一、區分顯示的聲明與隱式聲明(var)

JS中變量聲明分顯式聲明和隱式聲明。

var name = 'muzidigbig';//顯示聲明 
name = 'muzidigbig';//隱式聲明(為全局變量的一個屬性)

函數中使用var關鍵字進行顯式聲明的變量是做為局部變量,在全局范圍內聲明的變量為全局變量;而沒有用var關鍵字,使用直接賦值方式聲明的是全局變量(全局對象屬性)

//    name = 'muzidigbig';//隱式聲明(為全局變量的一個屬性)
    console.log(name);
    function  person(){
        name = '木子大大';
        console.log(name);
    }
    person();

 

當我們使用訪問一個沒有聲明的變量時,JS會報錯;而當我們給一個沒有聲明的變量賦值時,JS不會報錯,相反它會認為我們是要隱式聲明一個全局變量,這一點一定要注意。

name = 'muzidigbig';//隱式聲明(為全局變量的一個屬性)
console.log(name);
function  person(){
    name = '木子大大';
    console.log(name);//木子大大
}
person();

在當前域中聲明變量. 如果在方法中聲明,則為局部變量(local variable);如果是在全局域中聲明,則為全局變量。


而事實上是對屬性賦值操作。首先,它會嘗試在當前作用域鏈(如在方法中聲明,則當前作用域鏈代表全局作用域和方法局部作用域)中解析 name; 如果在任何當前作用域鏈中找到name,則會執行對name屬性賦值; 如果沒有找到name,它才會在全局對象(即當前作用域鏈的最頂層對象,如window對象)中創造name屬性並賦值。

注意!它並不是聲明了一個全局變量,而是創建了一個全局對象的屬性。

 

即便如此,可能你還是很難明白“變量聲明”跟“創建對象屬性”在這里的區別。事實上,Javascript的變量聲明、創建屬性以及每個Javascript中的每個屬性都有一定的標志說明它們的屬性----如只讀(ReadOnly)不可枚舉(DontEnum)不可刪除(DontDelete)等等。

由於變量聲明自帶不可刪除屬性,比較var name = 'muzidigbig' 跟 name = 'muzidigbig'

,前者是變量聲明,帶不可刪除屬性,因此無法被刪除;后者為全局變量的一個屬性,因此可以從全局變量中刪除。

 

 

 


免責聲明!

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



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