var?let?const關(guān)鍵字之間的區(qū)別及使用場(chǎng)景示例詳解
背景
在寫(xiě)js和ts代碼的時(shí)候,經(jīng)常會(huì)用到var、let、const關(guān)鍵字,雖然一直用,但是從來(lái)沒(méi)有去仔細(xì)研究他們之間的區(qū)別,偶爾遇到的使用的問(wèn)題,就直接換了另一個(gè)關(guān)鍵字,其中最明顯的就是我使用const沒(méi)有進(jìn)行初始化發(fā)現(xiàn)不行,就直接換成使用let就可以了,這篇文章就是為了研究其他之間的區(qū)別
一、var變量
1、var在全局作用域的應(yīng)用,使用var關(guān)鍵字聲明的變量,都會(huì)被提升到該作用域的最頂部,這就是我們常說(shuō)的變量提升
console.log(a); //undefind var a = 1; console.log(a); //1
等同于
var a; console.log(a); //undefined a = 1; console.log(a); //1
全局變量
在函數(shù)外聲明的變量作用域是全局的:
var carName = "Volvo"; function person(){ console.log(carName); // "Volvo" } person();
局部變量
在函數(shù)內(nèi)聲明的變量作用域是局部的(函數(shù)內(nèi)):
function person() { var carName = "Volvo"; console.log(carName); // "Volvo" } person(); console.log(carName); //報(bào)錯(cuò) Uncaught ReferenceError: a is not defined
使用 var 關(guān)鍵字在塊級(jí)作用域存在的問(wèn)題
var a = 10; console.log(a); // 10 { var a = 2; console.log(a); // 2 } console.log(a); // 2
重置變量
使用 var 關(guān)鍵字聲明的變量在任何地方都可以修改:
var x = 2; console.log(x); // 2 var x = 3; console.log(x); // 3
二、塊級(jí)作用域let、const
let、const聲明和var聲明用法一樣,不同點(diǎn)在于let、var聲明的是變量,const聲明的是常量。var存在變量提升,let、const不存在變量提升。var在全局作用域聲明的變量會(huì)掛載在window對(duì)象上
1、let 聲明
let聲明的是變量,沒(méi)有var那樣的變量提升,let聲明的變量只在當(dāng)前作用域中有效
全局變量
console.log(x);//報(bào)錯(cuò) Unexpected identifier 'Uncaught' let x = 1; console.log(x);// 1
塊級(jí)作用域
let 中不存在變量提升
{ console.log(x); //報(bào)錯(cuò) Unexpected identifier 'Uncaught' let x = 1; console.log(x); }
重置變量
在相同的作用域或塊級(jí)作用域中,不能let關(guān)鍵字來(lái)重置 var 關(guān)鍵字聲明
var x = 2; // 合法 let x = 3; // 不合法 { var x = 4; // 合法 let x = 5 // 不合法 }
在相同的作用域或塊級(jí)作用域中
let x = 2; // 合法 let x = 3; // 不合法 { let x = 4; // 合法 let x = 5; // 不合法 }
let 關(guān)鍵字在不同作用域,可以重新申明和賦值
let x = 2; // 合法 { let x = 3; // 合法 } { let x = 4; // 合法 }
2、const 聲明
const聲明的是常量,常量不可以修改。常量定義必須初始化值,如果不初始化值就會(huì)報(bào)錯(cuò)。
全局變量
{ console.log(x); //報(bào)錯(cuò) Unexpected identifier 'Uncaught' const x = 1; console.log(x); // 1 }
局部變量
{ const x = 1; console.log(x); //1; } console.log(x)// 報(bào)錯(cuò) Unexpected identifier 'Uncaught'
必須初始化,不能重新賦值
const x; console.log(x);// Uncaught SyntaxError: Missing initializer in const declaration const x = 10; x = 20; // 報(bào)錯(cuò),const 變量不可重新賦值
對(duì)象和數(shù)組,對(duì)于引用類(lèi)型(對(duì)象和數(shù)組),const 保證的是變量引用的地址不變,但對(duì)象或數(shù)組本身是可以修改的。
const x = [1, 2, 3]; x.push(4); // 合法,數(shù)組本身可以修改 x = [5, 6, 7]; // 報(bào)錯(cuò),變量引用地址不可變
總結(jié)
let、var聲明的是變量,const聲明的是常量。var存在變量提升,let、const不存在變量提升。var在全局作用域聲明的變量會(huì)掛載在window對(duì)象上,而let const聲明的變量則不會(huì)有這一行為。let聲明的是變量,沒(méi)有var那樣的變量提升,let聲明的變量只在當(dāng)前作用域中有效,const聲明的是常量,常量不可以修改。常量定義必須初始化值,如果不初始化值就會(huì)報(bào)錯(cuò)。
以上就是var let const關(guān)鍵字之間的區(qū)別及使用場(chǎng)景示例詳解的詳細(xì)內(nèi)容,更多關(guān)于var let const關(guān)鍵字的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
你不知道的JS?ES6字符串標(biāo)簽函數(shù)分享
字符串標(biāo)簽函數(shù)是一種特殊的函數(shù)調(diào)用語(yǔ)法,本文將深入探討ES6中字符串標(biāo)簽函數(shù)的工作原理,并結(jié)合具體的代碼展示它的威力,快跟隨小編一起學(xué)習(xí)起來(lái)吧2023-06-06JavaScript作用域與作用域鏈?zhǔn)褂弥攸c(diǎn)講解
當(dāng)代碼在一個(gè)環(huán)境中執(zhí)行時(shí),會(huì)創(chuàng)建變量對(duì)象的一個(gè)作用域鏈,作用域鏈的用途是保證對(duì)執(zhí)行環(huán)境有權(quán)訪問(wèn)的所有變量和函數(shù)的有序訪問(wèn),下面這篇文章主要給大家介紹了關(guān)于JavaScript作用域與作用域鏈的相關(guān)資料,需要的朋友可以參考下2022-10-10微信二次分享報(bào)錯(cuò)invalid signature問(wèn)題及解決方法
基于微信公眾號(hào)開(kāi)發(fā)的h5頁(yè)面(使用jssdk接口),由用戶(hù)A分享給用戶(hù)B,用戶(hù)B再次分享這個(gè)頁(yè)面時(shí),不能成功分享。這篇文章主要介紹了微信二次分享報(bào)錯(cuò)invalid signature問(wèn)題及解決方法,需要的朋友可以參考下2019-04-04微信小程序 TLS 版本必須大于等于1.2問(wèn)題解決
這篇文章主要介紹了微信小程序 TLS 版本必須大于等于1.2問(wèn)題解決的相關(guān)資料,需要的朋友可以參考下2017-02-02echarts圖表無(wú)數(shù)據(jù)/空數(shù)據(jù)如何展示"暫無(wú)數(shù)據(jù)"
在開(kāi)發(fā)echarts的時(shí)候我們不得不考慮數(shù)據(jù)為空的情況,其實(shí)有很多種解決辦法,下面這篇文章主要給大家介紹了關(guān)于echarts圖表無(wú)數(shù)據(jù)/空數(shù)據(jù)如何展示“暫無(wú)數(shù)據(jù)”的相關(guān)資料,需要的朋友可以參考下2022-10-10有關(guān)json_decode亂碼及NULL的問(wèn)題
json decode出現(xiàn)中文亂碼,返回null,很多朋友都遇到過(guò)吧,該怎么解決呢?下面小編把解決辦法分享在腳本之家網(wǎng)站上,供大家學(xué)習(xí)2015-10-10