javascript 沒有var,會產(chǎn)生什么樣的影響呢?在javascript ES6之前,我們一直都是用var來聲明變量的。但是,自從ES6發(fā)布以后,我們又多了let和const。那么為什么ES6要引入新的變量聲明方式呢?本文將為大家深入講解javascript沒有var的相關(guān)內(nèi)容。
在ES5中,var聲明的變量有以下的缺點:
1. 變量提升問題
2. 容易造成全局污染
我們先來看變量提升問題。所謂變量提升,就是腳本開始運行時,js引擎會自動將所有的變量聲明提升到當(dāng)前作用域的頂部。例如:
console.log(a); // undefined var a = 1;以上代碼不會報錯,因為在變量a之前已經(jīng)進行了聲明提升。但是輸出結(jié)果會是undefined,而不是1。這是因為雖然聲明提升了,但是變量的賦值還沒有執(zhí)行,也就是說,在console.log(a)時,變量a的值還沒有被賦值。 而使用let和const聲明變量則沒有變量提升問題。例如:
console.log(a); // ReferenceError: a is not defined let a = 1;以上代碼會拋出錯誤,因為聲明提升機制對于let和const是不起作用的。在使用let和const聲明變量的情況下,變量a只有在聲明處開始存在,而不是在作用域的頂部。所以,在console.log(a)時,a變量還沒有被聲明過,所以拋出了ReferenceError。 其次,使用var聲明的變量會容易造成全局污染。例如:
var name = 'Tom'; function foo() { console.log(name); }以上代碼中,name變量被聲明在全局作用域中,所以foo函數(shù)中也能夠訪問到該變量。這雖然解決了變量作用域的問題,但是如果在其他地方再次聲明同名的變量,會直接覆蓋原來的全局變量,進而影響全局的業(yè)務(wù)邏輯。 而使用let和const聲明變量則沒有這個問題。例如:
let name = 'Tom'; function foo() { console.log(name); }以上代碼中,name變量只存在于其所在的塊級作用域中,并不會對外部作用域造成污染。另外,如果在函數(shù)內(nèi)部或者其他塊級作用域中聲明相同名字的變量,也不會互相影響。 因此,ES6中推出了let和const來解決上述問題,從而取代了使用var聲明變量的方式。 那么,let和const有什么區(qū)別呢?let和const的區(qū)別如下: 1. const聲明的變量不能被改變,一旦賦值就不能重新賦值 2. const聲明的變量必須進行初始化 因此,在使用let和const時,要注意一下兩點。 總體來說,javascript沒有var這一說法,采用了let和const來代替。今天的講解中,我們主要講了var聲明變量的缺點以及ES6中引入let和const的原因和區(qū)別。希望讀者能夠掌握這些知識,寫出更加規(guī)范的javascript代碼。