摘要:所以,最終極的辦法是一層一層凍結(jié)所有對(duì)象。塊級(jí)作用域使呈現(xiàn)出塊級(jí)作用域的特征。聲明的變量僅存在于當(dāng)前塊級(jí)作用域中。在中,嚴(yán)格模式下等價(jià)于使用聲明,非嚴(yán)格下等價(jià)于使用。在中使用聲明的變量,為了保持程序的嚴(yán)謹(jǐn)性,不允許被訪問。
let和const都是聲明變量的新方式。
一般的,由于這兩種聲明方式的特性,現(xiàn)在項(xiàng)目組的開發(fā)規(guī)范中都會(huì)要求:不使用var而是let或const。
const用于定義不可更改的常量。
不可更改,意思是標(biāo)識(shí)符存儲(chǔ)的值不可更改。
這意味著,如果存儲(chǔ)的是對(duì)象的地址,改動(dòng)地址指向的內(nèi)存是可以的。
"use strict"; const OBJ = {}; OBJ.name = "OBJ"; // 成功 OBJ = {}; // 失敗,改變了存儲(chǔ)的地址。
由此可聯(lián)想到ES5的凍結(jié)對(duì)象。
如果對(duì)象的屬性是個(gè)指針,依然是可以修改的。
所以,最終極的辦法是一層一層凍結(jié)所有對(duì)象。
let使{}呈現(xiàn)出塊級(jí)作用域的特征。
聲明的變量僅存在于當(dāng)前塊級(jí)作用域中。
不可在同一塊級(jí)作用域中重復(fù)聲明變量。
一旦在塊級(jí)作用域中聲明了變量,此變量便綁定在這個(gè)區(qū)域,不再受外部的影響。
"use strict"; if (true) { var a = 1; let b = 2; } console.log(a); // 1 console.log(b); // error, b is not defined.定義函數(shù)
在塊級(jí)作用域中,優(yōu)先使用表達(dá)式聲明函數(shù)(let, const, var)。
不要使用聲明式聲明函數(shù),因?yàn)椴煌瑸g覽器在這方面的實(shí)現(xiàn)有所差異。
在Chrome中,嚴(yán)格模式下等價(jià)于使用let聲明,非嚴(yán)格下等價(jià)于使用var。
// 在 Chrome 66 瀏覽器。 // --- 嚴(yán)格模式 "use strict"; console.log(fn); // error, fn is not defined. if (true) { function fn() { console.log("hi"); } } console.log(fn); // error, fn is not defined. // --- 非嚴(yán)格模式。 console.log(fn); // undefined if (true) { function fn() { console.log("hi"); } } console.log(fn); // function暫時(shí)性死區(qū)
塊級(jí)作用域的頂部到聲明此變量之前的區(qū)域,稱為此變量的暫時(shí)性死區(qū)。
在暫時(shí)性死區(qū)內(nèi),不能使用該變量。
"use strict"; let a = 1; { // 在這里使用 a 會(huì)報(bào)錯(cuò)。 let a = 2; } // 對(duì)比 var var b = 2; fn(); console.log(b); // 2 function fn() { b = 1; var b; console.log(b); // 1 }
let也存在變量提升,只不過對(duì)待方式和之前不同。
變量提升,簡單的說就是在執(zhí)行代碼前先會(huì)看到底聲明了哪些變量和方法。
在ES5中使用var聲明的變量,在聲明之前可以訪問,其值為undefined。
在ES6中使用let聲明的變量,為了保持程序的嚴(yán)謹(jǐn)性,不允許被訪問。
在之前的版本中,全局變量等價(jià)于頂層對(duì)象的相應(yīng)屬性。
而ES6中新的變量聲明方式(let, const, class)定義的全局變量與頂層對(duì)象的屬性脫鉤。
const MY = {}; console.log(window.MY); // undefined替代自執(zhí)行函數(shù) 定義臨時(shí)變量
// ---ES5 (function() { var a = 1; })(); // ---ES6 { let a = 1; }簡化for循化
// ---ES5 // 使用自執(zhí)行函數(shù)獲取并切斷變量,再用閉包存儲(chǔ)變量 var fns = []; for (var i = 0; i < 7; i++) { fns[i] = (function(n) { return function() { console.log(n); }; })(i); } fns[3](); // 3 // ---ES6 var fns = []; for (let i = 0; i < 7; i++) { fns[i] = function() { console.log(i); }; } fns[3](); // 3for+let組合的理解
for后面的()是一個(gè)獨(dú)立的作用域。
for后面的{}是一個(gè)獨(dú)立的作用域。
for后面的{}中的作用域鏈為:本身 > () > 外部。
每次循環(huán),都會(huì)重新在()里定義i,并將其值設(shè)置為其上次循環(huán)結(jié)束的值。
// 證明 () 是一個(gè)獨(dú)立的作用域。 let i = 3; for (let i = 0; i< 7; i++) {} console.log(i); // 3 // 證明 {} 的作用域鏈為:本身 -> ()作用域 -> 外部作用域。 for (let i = 0; i< 7; i++) { i = 7; console.log(i); // 紙打印一次,值為 7 。 } for (let i = 0; i< 7; i++) { let i = "hi"; console.log(i); // 打印 7 次 "hi" 。 }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95307.html
摘要:前言新增了兩種基本的原生數(shù)據(jù)集合和加上和現(xiàn)在共有四種,以及由兩者衍生出的弱引用集合和。其本身是生成實(shí)例數(shù)據(jù)集合的構(gòu)造函數(shù),可以接受一個(gè)數(shù)組或具有接口的數(shù)據(jù)結(jié)構(gòu)作為參數(shù)用來初始化。返回鍵值對(duì)的遍歷器對(duì)象,鍵值對(duì)為鍵名鍵值。 前言 ES6新增了兩種基本的原生數(shù)據(jù)集合:Set和Map(加上Array和Object現(xiàn)在共有四種),以及由兩者衍生出的弱引用集合:WeakSet和WeakMap。從...
摘要:聲明的變量只在其所在的代碼塊內(nèi)有效。只要在聲明之前使用這些變量,就會(huì)報(bào)錯(cuò)。在語法上稱為暫時(shí)性死區(qū)有時(shí)候,會(huì)不經(jīng)間遇到比較隱蔽的死區(qū),不太容易被發(fā)現(xiàn)。不允許重復(fù)聲明不允許在相同的作用域內(nèi)聲明同一個(gè)變量。一旦聲明,其值就不能再改變。 let && const let let聲明的變量只在其所在的代碼塊內(nèi)有效。 { let a = 10; } console.log(a) //R...
摘要:在函數(shù)方面的擴(kuò)展比較豐富也很實(shí)用,本篇概括了這中的精華知識(shí)。所以無法成為構(gòu)造函數(shù),不能使用操作符。參數(shù)將擴(kuò)展運(yùn)算符作用于參數(shù),即為參數(shù)。聲明式,直接為函數(shù)名。通過構(gòu)造函數(shù)生成的,為。函數(shù)的屬性,在其描述對(duì)象的屬性上,為函數(shù)名。 ES6在函數(shù)方面的擴(kuò)展比較豐富也很實(shí)用,本篇概括了這中的精華知識(shí)。 1 箭頭函數(shù) 箭頭函數(shù)是ES6中定義函數(shù)的新形式。 新形式不僅簡化了定義方式,更為函數(shù)本身...
摘要:副作用,無副作用可執(zhí)行和關(guān)鍵詞。和不能像一樣同一個(gè)下聲明多次和不會(huì)像一樣變量聲明提升原因是,存在因此不能,賦值前使用變量。 showImg(https://segmentfault.com/img/bVbhPlD?w=1271&h=715); 關(guān)鍵詞: let ,const, blocking scope ,temporal dead zone,redeclaration,reassi...
摘要:資料參考是阮一峰老師寫的教程命令新增的命令,使用來聲明變量的,就像一樣,但是聲明的變量只在所在的代碼塊中有效。凡是在聲明之前使用這個(gè)變量都會(huì)報(bào)錯(cuò)塊級(jí)作用域中擁有全局作用域和函數(shù)作用域,添加了塊級(jí)作用域。 資料參考是阮一峰老師寫的ES6教程 let&const命令 let ES6新增的let命令,使用來聲明變量的,就像var一樣,但是聲明的變量只在let所在的代碼塊中有效。 e.g { ...
閱讀 433·2019-08-29 12:44
閱讀 3011·2019-08-26 17:49
閱讀 2433·2019-08-26 13:40
閱讀 1185·2019-08-26 13:39
閱讀 3663·2019-08-26 11:59
閱讀 1827·2019-08-26 10:59
閱讀 2465·2019-08-23 18:33
閱讀 2697·2019-08-23 18:30