哇!我終於畢業論文答辯完了,坐等畢業了,今後社會人,好興奮!哈哈哈!安全
以前的時間都在忙工做和畢業論文,畢業設計的事情,沒怎麼寫文章,五一補補!bash
其實塊級做用域很好理解,沒那麼高大上!你們都知道代碼塊
,好比if(){}
、while(){}
等,{}
大括號裏邊即爲塊級做用域。ui
在ES6以前是沒有塊級變量的,所以就會出現以下的狀況:spa
什麼意思呢?就是說一個for
循環的變量i
,在for
循環結束以後依舊存在而不被銷燬,詳細看下面的代碼:設計
for(var i = 0; i < 10; i++) {
}
console.log(i); //10
複製代碼
上面的代碼for
循環結束以後依舊輸出i
的值爲10,而不是undefined
,咱們就說該變量逃逸出了for
代碼塊,從而使變量i
變成了全局變量,使用不慎會致使相關的安全問題。指針
其實在Java
中也有指針逃逸的問題,指的是執行一個方法結束以後,相應的局部變量隨着該方法傳遞到其餘方法中去了,通常是在return
中將變量返回了,更多知識,請自行谷哥。code
let
命令let
命令用於聲明一個塊級做用域變量,和傳統的var
變量不一樣,let
變量只在聲明的代碼塊中有效,出了代碼塊就找不到該變量了,以下面的代碼:對象
{
let str = "hello world!"
console.log(str);
}
console.log(str);//ReferenceError: str is not defined
複製代碼
使用let
的注意點:遞歸
針對第一點,看以下代碼:ci
console.log(a);
let a = 9;
複製代碼
上面的代碼會拋出一個ReferenceError
,注意是error
而不是undefined
。 第二點:看以下代碼:
{
let message = "";
let message = "message";
}
複製代碼
上面的代碼會報SyntaxError
,表示變量message
已經定義了。
const
命令const
命令用於建立一個常量,常量嘛!一旦建立就不能修改,任何想改變常量的值都會報錯。但這也不是絕對的,下面會講到爲何能夠對一個常量進行修改。
因爲常量的值聲明以後不能修改,因此咱們在聲明常量的同時必須對其初始化。
首先JavaScirpt
中有兩種類型的常量,分別是:
對於基本類型的常量,一旦聲明,就不能夠改變,如修改下面的常量,將報錯:
const i = 8;
i = 18; // VM745:2 Uncaught TypeError: Assignment to constant variable.
複製代碼
對於引用類型的常量,常量所指向的地址是不能改變的,但能夠改變引用的成員屬性,如:
const obj = {};
obj = {a:1} // error
// obj.name = "Mike" //OK
複製代碼
若是想要讓引用類型的常量屬性總體都不能增長、刪除屬性,可使用Object.freeze
方法。可是還有這樣一種狀況,當常量對象的某個鍵的值又是一個引用類型時,依舊仍是能夠對其進行修改的。要想完全肯定一個引用常量不能被修改,還需對其全部鍵值執行Object.freeze
方法。
var constant = (obj) => {
Object.freeze(obj);
Object.keys(obj).forEach( (key,value) => {
if ( typeof obj[key] === 'object' ) {
constant(obj[key]); // 遞歸
}
});
};
複製代碼
使用const
的注意點和使用let
同樣:
謝謝閱讀!歡迎評論區留言討論、交流!