1.var
var 定義變量,沒有塊的概念,可以跨域訪問,不能跨函數(shù)訪問,不初始等于undefined,不會(huì)報(bào)錯(cuò)
在函數(shù)外面聲明是全局變量:
var a = 'b'
//在這里可以使用a變量
fuction f(){
//在這里可以使用a變量
}
var沒有塊的概念:
{
var a = 5
}
// 這里可以使用 a 變量
在函數(shù)中蛮艰,用var聲明是局部的犁柜,let,const也一樣, 例如:
//在這里不能使用a變量
fuction f(){
var a = 'b'
}
var在循環(huán)作用域中颅悉, 是全局變量隧土,與let不同
var i = 1; //這里不寫這句話最后i輸出也是10
for (var i = 0; i < 10; i++) {
// 代碼...
}
// 這里輸出 i 為 10
let i = 1; //這里不寫這句話,最后一句會(huì)報(bào)錯(cuò)攒暇,i不存在
for (let = 0; i < 10; i++) {
// 代碼...
}
// 這里輸出 i 為 1
html中使用全局變量
- 在 JavaScript 中, 全局作用域是針對(duì) JavaScript 環(huán)境。
- 在 HTML 中, 全局作用域是針對(duì) window 對(duì)象子房。
使用 var 關(guān)鍵字聲明的全局作用域變量屬于 window 對(duì)象:
var a = "b";
// 可以使用 window.a訪問變量
使用 let 關(guān)鍵字聲明的全局作用域變量不屬于 window 對(duì)象:
let a = "b";
// 不能使用 window.a訪問變量
va關(guān)鍵字可以任意修改形用,let不可以;在相同塊級(jí)let不能重新聲明var的變量证杭,也不能重新聲明let變量
var a = 2
var a = 3 //可以
let a = 5 //不可以
let a = 2
let a = 3 //不可以
{
let a = 5 //可以
}
var有變量提升田度,但只是提升聲明,不會(huì)提升初始化解愤,let沒有變量提升
//這里可以使用a變量,镇饺,不能使用b變量
a = 5
c = 4 //不可以,會(huì)報(bào)錯(cuò) let沒有變量提升
console.log(a) // 5
console.log(c) // undefined var只是變量提升送讲,初始化不提升
var a
var b = 5
let c
2.let
let定義變量,只能在塊作用域里訪問,也不能跨函數(shù)訪問,對(duì)函數(shù)外部無影響,不初始等于undefined
3.const
const定義常量,只能在塊作用域里訪問,也不能跨函數(shù),使用時(shí)必須初始化,要附上值,而且不能修改
但const定義一個(gè)對(duì)象奸笤,對(duì)象中的值可以改變
所以const實(shí)際上是不允許地址改變
const test = {
a:1,
b:2,
};
test.a = 5; //但如說直接給a賦值不允許
console.log(test);
運(yùn)行結(jié)果:
- const不能修改,會(huì)報(bào)錯(cuò),如下圖
-
const定義的常量必須先賦值,否則回報(bào)錯(cuò),如下圖
const得先賦值
var沒有塊的概念,可以跨域訪問
-
let 和 const 有塊的概念,不可以跨域訪問,跨域訪問會(huì)報(bào)錯(cuò)
image
輸出結(jié)果:(在塊外訪問就會(huì)報(bào)錯(cuò))
image
image
image
-
var let const 都不能跨函數(shù)訪問(作用域不同不能訪問),作用域相同才可以訪問
image
let完全可以取代var,因?yàn)閮烧哒Z義相同哼鬓,而且let沒有副作用监右。
let和const的本質(zhì)區(qū)別,其實(shí)是編譯器內(nèi)部的處理不同魄宏。一個(gè)聲明變量,一個(gè)聲明常量.
const聲明常量還有兩個(gè)好處秸侣,一是閱讀代碼的人立刻會(huì)意識(shí)到不應(yīng)該修改這個(gè)值,二是防止了無意間修改變量值所導(dǎo)致的錯(cuò)誤宠互。