JS中的var和let的區別

ES6 新增了let命令,用來聲明局部變量。它的用法類似於var,但是所聲明的變量,只在let命令所在的代碼塊內有效,而且有暫時性死區的約束。

let和var之間一共有4處區別:

01-作用域只侷限於當前代碼塊
02-使用let生命的變量作用域不會被提升
03-在相同作用域下不能聲明相同的變量
04-for循環體現let的父子作用域

我們會做幾個例子來驗證這這四處不同:

在這之前我們需要佈局一下頁面:
		<button>按鈕1</button>
		<button>按鈕2</button>
		<button>按鈕3</button>
		<button>按鈕4</button>
		<button>按鈕5</button>

此時頁面上顯示着五個按鈕:

在這裏插入圖片描述

01-作用域只侷限於當前代碼塊

當我們在一個作用域裏分別創建兩個變量,然後在作用域外面再調用的時候

			{
				var str="張三";
				console.log(str);
				
				let str1="李四";
				console.log(str1);
				
			}
			//發現這時候能輸出出來張三
			console.log("var的"+str)

			//這時候就報錯了
			//str1 is not defined
			console.log("let的"+str1)

此時,頁面上顯示:在作用域外面str1就沒有被定義
在這裏插入圖片描述

02-使用let中聲明的變量作用域不會被提升

當我們在一個作用域內裏,聲明變量之前打印這個變量的話會有不同的結果

{
				//輸出的是undefined
				console.log(str)
				var str="張三"

				//而let不會,會顯示這個變量壓根就沒有被定義,在es6中就不存在這種作用域提升了

				//如果輸出的話會在當前作用域的前面去找,如果沒有找到會報錯
				console.log(str1)
				let str1="李四"
			}

此時,頁面上顯示:
在這裏插入圖片描述

03-在相同作用域下不能聲明相同的變量

當我們在同一個作用域內聲明瞭相同的變量時,都知道如果是var聲明的話會被覆蓋,而let聲明的就不是這樣了

			{
				
				var str="張三"
				var str="李四"
				//這時候會輸出李四,後邊的會把前面的覆蓋掉
				console.log(str)

				let str1="王五"
				let str1="趙六"
				//這時候報錯了
				//在這裏不會做任何的執行,會直接報錯
				console.log(str1)
			}

此時打印出來的是:
str被打印出來了
而str1顯示報錯
在這裏插入圖片描述
在這裏插入圖片描述

04-for循環體現let的父子作用域

首先,我們先獲取下頁面上的按鈕並添加個點擊事件
當我們用var定義變量並且循環的時候呢,

		var btns=document.querySelectorAll("button")
			for(var i=0;i<btns.length;i++){
				//console.log(i)
				btns[i].onclick=function(){
				console.log("點擊了第"+i+"個按鈕")
				//alert("hhhh")
			}
		}

不管在頁面上點擊哪個按鈕都會顯示:
點擊了第5個按鈕
在這裏插入圖片描述
但是在es6中就不是這樣的
直接把上面的var改成let

			let btns=document.querySelectorAll("button")
				for(let i=0;i<btns.length;i++){
				//console.log(i)
					btns[i].onclick=function(){
					console.log("點擊了第"+i+"個按鈕")
					//alert("hhhh")
				}
			}

這時候顯示的就是:
在這裏插入圖片描述
以上屬於個人筆記總結,如有疑問以及錯誤,歡迎私信或者評論區留言,一起交流進步~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章