var關鍵字
作用:后接變數名,用來定義變數
var num
這里通過var關鍵字定義了一個num變數,我們沒有給num初始化,此時num的值為undifined
var str ="kobe"
str=123
這里通過var關鍵字定義了一個保存“kobe”字串值的 變數str,str的資料型別不是被規定死的,第二行的代碼改變了存盤值得同時改變了資料型別(改變型別是不推薦的)
宣告范圍(函式作用域)
- 全域作用域下
var str = "hello,word"
function test() {
console.log(str)
}
test() //hello ,world
在全域作用域下通過var關鍵字定義的str變數為全域變數
var num1 = 1
console.log(window.num1, window.num2) //1,undefined
var num2 = 2
console.log(window.num1, window.num2) //1,2
這里要注意使用var全域宣告的變數會成為window物件的屬性
- 函式體內:
function test(){
var str="hello, world"
}
console.log(str) //報錯!
在函式體內通過var關鍵字定義str變數,函式被呼叫時會創建這個變數并給其賦值,同樣在函式被執行完畢后變數被銷毀,也就是說這個變數只在函式作用域內有效,在函式體外部我們是訪問不到的,
- 函式體內省略var關鍵字
test()
console.log(str) //hello, world
function test() {
str = "hello,word"
}
同樣是在函式體內定義,不同的是省略了var關鍵字,test函式被呼叫時(只要被呼叫一次)就會創建全域變數str,該變數和在直接全域作用域下定義的一樣都會成為window的屬性
變數提升
- 例1
console.log(str) //undefined
var str = "hello,word"
console.log(str) //hello, world
這里不會報錯是相當于執行了如下代碼
var str
console.log(str) //undefined
str="hello, world"
console.log(str) //hello, world
- 例2
var num = 1
var num = 2
console.log(num) //2
var num = 3
var num = 4
console.log(num) //4
相當于執行了如下代碼
var num
num=1
num=2
console.log(num) //2
num=3
num=4
console.log(num) //4
這就是var關鍵字存在的變數“提升”,也就是把所有變數宣告拉倒作用域的頂部,
let關鍵字
let關鍵字和var關鍵字的作用類似,不過相比于var,let顯得更加的嚴謹,let關鍵字不存在“變數提升”,let關鍵宣告的作用域范圍是塊作用域而var關鍵字是函式作用域
作用:后接變數名,定義變數
let str
str = 123
console.log(str) //123
str = "kobe"
console.log(str) //kobe
宣告范圍(塊級作用域)
{
var num = 1
}
console.log(num) //1
{
let num = 1
console.log(num) //1
}
console.log(num) //報錯!
正如開頭所說的let關鍵字不同于var關鍵字 他的宣告范圍為塊級作用域,在作用域外是訪問不到該變數的
var num=1
{
let num=2
console.lgo(num) //2
}
{
var num = 1
let num = 2
console.log(num) //報錯
}
{
let num=1
let num=2
console.log(num) //報錯
}
對于let關鍵字在同一塊級作用域中,相同識別符號會報錯
與var關鍵字不同 ,let關鍵字在全域作用域宣告的變數不會成為window物件的屬性
暫時性死區
相比于var關鍵字,let宣告的變數不會在作用域中被提升,
console.log(num) //報錯! 這里不會和var一樣列印undefined
let num=1
在num被宣告前執行的一瞬間成為“暫時性死區”
經典例題
for(var i=0;i<5;i++){
}
console.log(i) //5
通過var關鍵字定義的迭代變數會滲透到回圈體外部
for(let i=0;i<5;i++){
}
console.log(i) //報錯!
迭代變數的作用域是回圈體這個塊級作用域,let關鍵字定義的變數范圍正是塊級作用域,所以外部訪問會報錯
for (var i = 0; i < 5; i++) {
console.log(i)
}
//0 1 2 3 4
for(var i=0;i<5;i++){
setTimeout(()=>{console.log(i)},0)
}
// 5
加了定時器函式后列印結果變了,這是因為在退出回圈時迭代變數保存的是導致回圈退出的值:5,在之后的執行超時函式時所有的i都是同一個值:5
for(let i=0;i<5;i++){
setTimeout(()=>{console.log(i)},0)
}
//列印結果0 1 2 3 4
這是因為后臺會為個迭代回圈宣告一個新的迭代變數,他們都是互相獨立的,每一個超時函式時列印的都是不同的變數實體
const關鍵字
const關鍵字和let是類似的,唯一 一個重要區別是const關鍵字宣告變數時必須初始化,并且在修改const定義的變數時會報錯(這里指的是修改記憶體地址),在修改一個物件內部的一個屬性時是不會報錯的
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/301299.html
標籤:其他
下一篇:HTML入門筆記(一)
