一、塊級(jí)作用域綁定

var聲明及變量提升機(jī)制
function getValue(condition){
    if(condition){
        var value = "blue";
        return value;
    } else {
        console.log(value);
    }
    console.log(value);
}
getValue(0)
//undefined
//undefined

在預(yù)編譯階段js引擎會(huì)將上面函數(shù)修改成下面這樣

function getValue(condition){
    var value
    if(condition){
        value = "blue";
        return value;
    } else {
        console.log(value);
    }
    console.log(value);
}
塊級(jí)聲明
function getValue(condition){
    if(condition){
        let value = "blue";
    } else {
        //變量value在此處不存在
        return null
    }
    //變量value在此處不存在
}
var count = 30;
let count = 30;
//Uncaught SyntaxError: Identifier 'count' has already been declared
var count = 30;
if(condition){
    let count = 10;
    //不會(huì)拋出錯(cuò)誤
}
const maxItems = 30;
const name;
//Uncaught SyntaxError: Missing initializer in const declaration
const maxItems = 5;
maxItems = 6;
//Uncaught TypeError: Assignment to constant variable.
const person = {name: 'binperson'}
//可修改對(duì)象屬性的值
person.name = 'bin'
//拋出語(yǔ)法錯(cuò)誤
person = {
    name: 'bin'
}
//Uncaught TypeError: Assignment to constant variable.
臨時(shí)死區(qū)(TDZ)
if(condition){
    console.log(typeof value);//引用錯(cuò)誤!
    let value = "blue";
}
//Uncaught ReferenceError: value is not defined
console.log(typeof value) //"undefined"

if(condition){
    let value = "blue";
}

//循環(huán)中的塊作用域綁定

for(var i = 0; i < 10; i++){

}
console.log(i)//10

for(let j = 0; j < 10; j++){

}
//i在這里不可訪問(wèn)姓言,拋出一個(gè)錯(cuò)誤
console.log(j);
//Uncaught ReferenceError: j is not defined
var funcs = [];
for (var i=0; i < 10; i++){
    funcs.push(function(){
        console.log(i);
    });
}
funcs.forEach(function(func){
    func();//輸出10次數(shù)字10
});
var funcs = [];
for(var i = 0; i < 10; i++){
    funcs.push(function(value){
        return function(){
            console.log(value);
        }
    }(i));
}

funcs.forEach(function(func){
    func();//輸出0,然后1蔗蹋、2何荚,直到9
});
var funcs = []

for(let i = 0; i < 10; i++){
    funcs.push(function(){
        console.log(i);
    })
}
funcs.forEach(function(func){
    func();//輸出0,然后1猪杭、2兽泣,直到9
});
var funcs = [],
    object = {
        a: true,
        b: true,
        c: true
    };
for(let key in object){
    funcs.push(function(){
        console.log(key);
    })
}
funcs.forEach(function(func){
    func();//輸出a、b胁孙、c
})
//如果使用var聲明key唠倦,則都會(huì)輸出c
var funcs = []

for(const i = 0; i < 10; i++){
    funcs.push(function(){
        console.log(i);
    })
}
funcs.forEach(function(func){
    func();
});
//Uncaught TypeError: Assignment to constant variable.
var funcs = [],
object = {
    a: true,
    b: true,
    c: true
};
for(const key in object){//每次迭代不會(huì)修改已有綁定,而是會(huì)創(chuàng)建一個(gè)新綁定
    funcs.push(function(){
        console.log(key);
    })
}
funcs.forEach(function(func){
    func();//輸出a涮较、b稠鼻、c
})
//瀏覽器中
var RegExp = "Hello!";
console.log(window.RegExp); //"Hello!"

var ncz = "Hi!";
console.log(window.ncz);//"Hi!"
//let或const不能覆蓋全局變量,而只能屏蔽它
let RegExp = "Hello!";
console.log(RegExp);//"Hello!"
console.log(window.RegExp); //? RegExp() { [native code] }
console.log(window.RegExp === RegExp)//false

const ncz = "Hi!";
console.log(ncz);//"Hi"
console.log(window.ncz);//"Hi!"
console.log(window.ncz === ncz); //true
console.log("ncz" in window)//false
  • 如果希望在全局對(duì)象下定義變量狂票,仍然可以使用var候齿。這種情況常見(jiàn)于在瀏覽器中跨frame或跨window訪問(wèn)代碼
塊級(jí)綁定最佳實(shí)踐的進(jìn)化
  • 默認(rèn)使用const,只有確實(shí)需要改變變量的時(shí)使用let
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闺属,一起剝皮案震驚了整個(gè)濱河市慌盯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掂器,老刑警劉巖亚皂,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異国瓮,居然都是意外死亡灭必,警方通過(guò)查閱死者的電腦和手機(jī)狞谱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)禁漓,“玉大人跟衅,你說(shuō)我怎么就攤上這事〔ゼ撸” “怎么了伶跷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)秘狞。 經(jīng)常有香客問(wèn)我撩穿,道長(zhǎng),這世上最難降的妖魔是什么谒撼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任食寡,我火速辦了婚禮,結(jié)果婚禮上廓潜,老公的妹妹穿的比我還像新娘抵皱。我一直安慰自己,他們只是感情好辩蛋,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布呻畸。 她就那樣靜靜地躺著,像睡著了一般悼院。 火紅的嫁衣襯著肌膚如雪伤为。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天据途,我揣著相機(jī)與錄音绞愚,去河邊找鬼。 笑死颖医,一個(gè)胖子當(dāng)著我的面吹牛位衩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播熔萧,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼糖驴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了佛致?” 一聲冷哼從身側(cè)響起贮缕,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎俺榆,沒(méi)想到半個(gè)月后感昼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肋演,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年抑诸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爹殊。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜕乡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出梗夸,到底是詐尸還是另有隱情层玲,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布反症,位于F島的核電站辛块,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏铅碍。R本人自食惡果不足惜润绵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胞谈。 院中可真熱鬧尘盼,春花似錦、人聲如沸烦绳。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)径密。三九已至午阵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間享扔,已是汗流浹背底桂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惧眠,地道東北人戚啥。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像锉试,于是被迫代替她去往敵國(guó)和親猫十。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容