ES6->塊級(jí)作用域

塊級(jí)作用域

為什么需要塊級(jí)作用域向瓷?

ES5 只有全局作用域和函數(shù)作用域业踢,沒有塊級(jí)作用域,這帶來很多不合理的場(chǎng)景嗽冒。
第一種場(chǎng)景呀伙,內(nèi)層變量可能會(huì)覆蓋外層變量。

var tmp = new Date();

function f() {
  console.log(tmp);
  if (false) {
    var tmp = 'hello world';
  }
}

f(); // undefined

因?yàn)関ar的變量提升添坊,導(dǎo)致內(nèi)層的tmp變量覆蓋了外層的tmp變量剿另。

第二種場(chǎng)景,用來計(jì)數(shù)的循環(huán)變量泄露為全局變量贬蛙。

var s = 'hello';

for (var i = 0; i < s.length; i++) {
  console.log(s[i]);
}

console.log(i); // 5

上面代碼中雨女,變量i只用來控制循環(huán),但是循環(huán)結(jié)束后阳准,它并沒有消失氛堕,泄露成了全局變量。一般來說這并不是我們想要的溺职。
................................................................................................................

ES6 的塊級(jí)作用域

let實(shí)際上為 JavaScript 新增了塊級(jí)作用域岔擂。

var s = 'hello';

for (var i = 0; i < s.length; i++) {
  console.log(s[i]);
}

console.log(i); // 5

上面的函數(shù)有兩個(gè)代碼塊位喂,都聲明了變量n浪耘,運(yùn)行后輸出 5。這表示外層代碼塊不受內(nèi)層代碼塊的影響塑崖。如果兩次都使用var定義變量n七冲,最后輸出的值才是 10。

ES6 允許塊級(jí)作用域的任意嵌套规婆。

{{{{
  {let insane = 'Hello World'}
  console.log(insane); // 報(bào)錯(cuò)
}}}};

上面代碼使用了一個(gè)五層的塊級(jí)作用域澜躺,每一層都是一個(gè)單獨(dú)的作用域蝉稳。第四層作用域無法讀取第五層作用域的內(nèi)部變量。

內(nèi)層作用域可以定義外層作用域的同名變量掘鄙。并不會(huì)相互污染耘戚。

{{{{
  let insane = 'Hello World';
  {let insane = 'Hello World'}
}}}};

塊級(jí)作用域的出現(xiàn),實(shí)際上使得獲得廣泛應(yīng)用的立即執(zhí)行函數(shù)表達(dá)式(IIFE)不再必要了操漠。

// IIFE 寫法
(function () {
  var tmp = ...;
  ...
}());

// 塊級(jí)作用域?qū)懛?{
  let tmp = ...;
  ...
}

................................................................................................................

塊級(jí)作用域與函數(shù)聲明

函數(shù)能不能在塊級(jí)作用域之中聲明收津?這是一個(gè)相當(dāng)令人混淆的問題。

ES5 規(guī)定浊伙,函數(shù)只能在頂層作用域和函數(shù)作用域之中聲明撞秋,不能在塊級(jí)作用域聲明。

// 情況一
if (true) {
  function f() {}
}

// 情況二
try {
  function f() {}
} catch(e) {
  // ...
}

上面兩種函數(shù)聲明嚣鄙,根據(jù) ES5 的規(guī)定都是非法的吻贿。

但是,瀏覽器沒有遵守這個(gè)規(guī)定哑子,為了兼容以前的舊代碼舅列,還是支持在塊級(jí)作用域之中聲明函數(shù),因此上面兩種情況實(shí)際都能運(yùn)行卧蜓,不會(huì)報(bào)錯(cuò)剧蹂。

ES6 引入了塊級(jí)作用域,明確允許在塊級(jí)作用域之中聲明函數(shù)烦却。ES6 規(guī)定宠叼,塊級(jí)作用域之中,函數(shù)聲明語句的行為類似于let其爵,在塊級(jí)作用域之外不可引用冒冬。

function f() { console.log('I am outside!'); }

(function () {
  if (true) {
    // 重復(fù)聲明一次函數(shù)f
    function f() { console.log('I am inside!'); }
  }

  f();
}());

上面代碼在 ES5 中運(yùn)行,會(huì)得到“I am inside!”摩渺,因?yàn)樵趇f內(nèi)聲明的函數(shù)f會(huì)被提升到函數(shù)頭部简烤,實(shí)際運(yùn)行的代碼如下。

// 瀏覽器的 ES6 環(huán)境
function f() { console.log('I am outside!'); }

(function () {
  if (false) {
    // 重復(fù)聲明一次函數(shù)f
    function f() { console.log('I am inside!'); }
  }

  f();
}());
// Uncaught TypeError: f is not a function

上面的代碼在 ES6 瀏覽器中摇幻,都會(huì)報(bào)錯(cuò)横侦。
考慮到環(huán)境導(dǎo)致的行為差異太大,應(yīng)該避免在塊級(jí)作用域內(nèi)聲明函數(shù)绰姻。如果確實(shí)需要枉侧,也應(yīng)該寫成函數(shù)表達(dá)式,而不是函數(shù)聲明語句狂芋。

// 瀏覽器的 ES6 環(huán)境
// 塊級(jí)作用域內(nèi)部的函數(shù)聲明語句榨馁,建議不要使用
{
  let a = 'secret';
  function f() {
    return a;
  }
}

// 塊級(jí)作用域內(nèi)部,優(yōu)先使用函數(shù)表達(dá)式
{
  let a = 'secret';
  let f = function () {
    return a;
  };
}

另外帜矾,還有一個(gè)需要注意的地方翼虫。ES6 的塊級(jí)作用域必須有大括號(hào)屑柔,如果沒有大括號(hào),JavaScript 引擎就認(rèn)為不存在塊級(jí)作用域珍剑。

// 第一種寫法掸宛,報(bào)錯(cuò)
if (true) let x = 1;

// 第二種寫法,不報(bào)錯(cuò)
if (true) {
  let x = 1;
}

上面代碼中招拙,第一種寫法沒有大括號(hào)旁涤,所以不存在塊級(jí)作用域,而let只能出現(xiàn)在當(dāng)前作用域的頂層迫像,所以報(bào)錯(cuò)劈愚。第二種寫法有大括號(hào),所以塊級(jí)作用域成立闻妓。

函數(shù)聲明也是如此菌羽,嚴(yán)格模式下,函數(shù)只能聲明在當(dāng)前作用域的頂層由缆。

// 不報(bào)錯(cuò)
'use strict';
if (true) {
  function f() {}
}

// 報(bào)錯(cuò)
'use strict';
if (true)
  function f() {}}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末注祖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子均唉,更是在濱河造成了極大的恐慌是晨,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舔箭,死亡現(xiàn)場(chǎng)離奇詭異罩缴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)层扶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門箫章,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人镜会,你說我怎么就攤上這事檬寂。” “怎么了戳表?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵桶至,是天一觀的道長。 經(jīng)常有香客問我匾旭,道長镣屹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任季率,我火速辦了婚禮野瘦,結(jié)果婚禮上描沟,老公的妹妹穿的比我還像新娘飒泻。我一直安慰自己鞭光,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布泞遗。 她就那樣靜靜地躺著惰许,像睡著了一般。 火紅的嫁衣襯著肌膚如雪史辙。 梳的紋絲不亂的頭發(fā)上汹买,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音聊倔,去河邊找鬼晦毙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛耙蔑,可吹牛的內(nèi)容都是我干的见妒。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼甸陌,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼须揣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钱豁,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤耻卡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后牲尺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卵酪,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年谤碳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凛澎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡估蹄,死狀恐怖塑煎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情臭蚁,我是刑警寧澤最铁,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站垮兑,受9級(jí)特大地震影響冷尉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜系枪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一雀哨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦雾棺、人聲如沸膊夹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽放刨。三九已至,卻和暖如春尸饺,著一層夾襖步出監(jiān)牢的瞬間进统,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國打工浪听, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留螟碎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓迹栓,卻偏偏與公主長得像抚芦,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子迈螟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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

  • var聲明及變量提升(Hoisting)機(jī)制 在函數(shù)作用域或全局作用域鐘通過關(guān)鍵字var聲明的變量叉抡,都會(huì)被當(dāng)成在當(dāng)...
    鋼小牙閱讀 417評(píng)論 0 1
  • ES5中,沒有塊級(jí)作用域答毫,所以會(huì)出現(xiàn)以下情況: 這段代碼的結(jié)果是輸出3個(gè)6褥民。 首先var i=0這一句話,將i做了...
    罌粟1995閱讀 176評(píng)論 0 1
  • title: es6-塊級(jí)作用域綁定date: 2018-01-24 21:32:33tags: es6 前言 花...
    aymfx閱讀 193評(píng)論 0 0
  • 命運(yùn)洗搂,一個(gè)讓人覺得神秘又無奈的詞消返。每個(gè)人都想掌控自己的命運(yùn),卻又不知該如何做到耘拇,而現(xiàn)在的科技給了我們一種簡...
    唯語豆閱讀 375評(píng)論 0 4
  • 古時(shí)候撵颊,有一對(duì)老夫婦直到晚年才生了一個(gè)寶貝兒子,看的異常珍貴惫叛,孩子自小長得聰明伶俐倡勇,父母更是含在嘴里怕化了,頂在頭...
    雪韻冰馨閱讀 167評(píng)論 0 4