JavaScript變量聲明var,let.const及區(qū)別淺析
var聲明變量的作用域限制在其聲明位置的上下文中
var x = 0; // x是全局變量,并且賦值為0。 console.log(typeof z); // undefined,因為z還不存在。 function a() { // 當(dāng)a被調(diào)用時, var y = 2; // y被聲明成函數(shù)a作用域的變量,然后賦值成2。 console.log(x, y); // 0 2 function b() { // 當(dāng)b被調(diào)用時, x = 3; // 全局變量x被賦值為3,不生成全局變量。 y = 4; // 已存在的外部函數(shù)的y變量被賦值為4,不生成新的全局變量。 z = 5; // 創(chuàng)建新的全局變量z,并且給z賦值為5。 } // (在嚴(yán)格模式下(strict mode)拋出ReferenceError) b(); // 調(diào)用b時創(chuàng)建了全局變量z。 console.log(x, y, z); // 3 4 5 } a(); // 調(diào)用a時同時調(diào)用了b。 console.log(x, z); // 3 5 console.log(typeof y); // undefined,因為y是a函數(shù)的本地(local)變量。
let 聲明的變量只在其聲明的塊或子塊中可用,var的作用域是整個封閉函數(shù)
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 }
在 ECMAScript 2015 中,let綁定不受變量提升的約束,這意味著let聲明不會被提升到當(dāng)前執(zhí)行上下文的頂部。
在塊中的變量初始化之前,引用它將會導(dǎo)致 ReferenceError(而使用 var 聲明變量則恰恰相反,該變量的值是 undefined )
當(dāng)在塊中使用時,let將變量的作用域限制為該塊。注意var的作用域在它被聲明的函數(shù)內(nèi)的區(qū)
var a = 1; var b = 2; if (a === 1) { var a = 11; // the scope is global let b = 22; // the scope is inside the if-block console.log(a); // 11 console.log(b); // 22 } console.log(a); // 11 console.log(b); // 2
const 常量必須在聲明的同時指定它的值.
const聲明創(chuàng)建一個值的只讀引用。但這并不意味著它所持有的值是不可變的(如引用內(nèi)容是對象),只是變量標(biāo)識符不能重新分配一個常量不能和它所在作用域內(nèi)的其他變量或函數(shù)擁有相同的名稱
// 注意: 常量在聲明的時候可以使用大小寫,但通常情況下全部用大寫字母。 // 定義常量MY_FAV并賦值7 const MY_FAV = 7; // 報錯 MY_FAV = 20; // 輸出 7 console.log("my favorite number is: " + MY_FAV); // 嘗試重新聲明會報錯 const MY_FAV = 20; // MY_FAV 保留給上面的常量,這個操作會失敗 var MY_FAV = 20; // 也會報錯 let MY_FAV = 20; // 注意塊范圍的性質(zhì)很重要 if (MY_FAV === 7) { // 沒問題,并且創(chuàng)建了一個塊作用域變量 MY_FAV // (works equally well with let to declare a block scoped non const variable) let MY_FAV = 20; // MY_FAV 現(xiàn)在為 20 console.log('my favorite number is ' + MY_FAV); // 這被提升到全局上下文并引發(fā)錯誤 var MY_FAV = 20; } // MY_FAV 依舊為7 console.log("my favorite number is " + MY_FAV); // 常量要求一個初始值 const FOO; // SyntaxError: missing = in const declaration // 常量可以定義成對象 const MY_OBJECT = {"key": "value"}; // 重寫對象和上面一樣會失敗 MY_OBJECT = {"OTHER_KEY": "value"}; // 對象屬性并不在保護的范圍內(nèi),下面這個聲明會成功執(zhí)行 MY_OBJECT.key = "otherValue"; // 也可以用來定義數(shù)組 const MY_ARRAY = []; // It's possible to push items into the array // 可以向數(shù)組填充數(shù)據(jù) MY_ARRAY.push('A'); // ["A"] // 但是,將一個新數(shù)組賦給變量會引發(fā)錯誤 MY_ARRAY = ['B']
下面介紹下在javascript中有三種聲明變量的方式:var、let、const。
var 聲明全局變量,換句話理解就是,聲明在for循環(huán)中的變量,跳出for循環(huán)同樣可以使用。
for(var i=0;i<=1000;i++){ var sum=0; sum+=i; } alert(sum);
聲明在for循環(huán)內(nèi)部的sum,跳出for循環(huán)一樣可以使用,不會報錯正常彈出結(jié)果
let:聲明塊級變量,即局部變量。
在上面的例子中,跳出for循環(huán),再使用sum變量就會報錯,有著嚴(yán)格的作用域,變量只作用域當(dāng)前隸屬的代碼塊,不可重復(fù)定義同一個變量,不可在聲明之前調(diào)用,必須先定義再使用,會報錯,循環(huán)體中可以用let
注意:必須聲明'use strict';后才能使用let聲明變量否則瀏覽并不能顯示結(jié)果,
const:用于聲明常量,也具有塊級作用域 ,也可聲明塊級。
const PI=3.14;
它和let一樣,也不能重復(fù)定義同一個變量,const一旦定義,無法修改。
總結(jié)
以上所述是小編給大家介紹的JavaScript變量聲明var,let.const及區(qū)別淺析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
關(guān)于前后端json數(shù)據(jù)的發(fā)送與接收詳解
這篇文章主要給大家介紹了關(guān)于前后端json數(shù)據(jù)發(fā)送與接收的相關(guān)資料,文中通過示例代碼詳細(xì)介紹了關(guān)于flask中的json數(shù)據(jù)接收和前端發(fā)送json數(shù)據(jù)等內(nèi)容,需要的朋友可以參考借鑒,下面來一起看看吧。2017-07-07JavaScript實現(xiàn)帶緩沖效果的隨屏滾動漂浮廣告代碼
這篇文章主要介紹了JavaScript實現(xiàn)帶緩沖效果的隨屏滾動漂浮廣告代碼,通過JavaScript結(jié)合時間函數(shù)動態(tài)響應(yīng)頁面元素滾動事件實現(xiàn)懸浮廣告的緩沖漂浮效果,非常簡單實用,需要的朋友可以參考下2015-11-11解決在layer.open中使用時間控件laydate失敗的問題
今天小編就為大家分享一篇解決在layer.open中使用時間控件laydate失敗的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09