語言基礎-變數 前言 從本篇博客開始 博主個人認為重要的知識點都會在在行前添加 ⭐ 來進行標識 變數 ECMASCRIPT變數是鬆散類型,意思是變數可以用於保存任何類型的數據。ECMASCRIPT中有三個關鍵字可以來聲明變數:var、let和const。 值得註意的是let和const只能在ES6以 ...
語言基礎-變數
前言
從本篇博客開始 博主個人認為重要的知識點都會在在行前添加 ⭐ 來進行標識
變數
ECMASCRIPT變數是鬆散類型,意思是變數可以用於保存任何類型的數據。ECMASCRIPT中有三個關鍵字可以來聲明變數:var、let和const。
值得註意的是let和const只能在ES6以及更晚的版本中使用。
var關鍵字
定義變數的基本方式:
var message;//個人不推薦,在不初始化的情況下定義變數,就會保存一個特殊的值undefinded。
var car="賓士";//ECMASCRIPT 實現變數初始化,此時就可以定義變數並設置它的初始值。
car=100;//合法,但是不推薦。
上面對於car變數的操作中,有一點值得註意,car變數首先被定義為一個字元串變數,後來又被賦值為數值。雖然這在ECMASCRIPT中完全合法,但是想想當項目龐大起來,一個能被隨意賦值的變數會給項目增加多大的維護難度。這可能就是為啥現在TypeScript那麼被青睞的原因之一。
var的作用域
⭐var是函數作用域,也就是說在函數內定義變數 在會在函數內部生效,併在函數退出時銷毀該變數,這裡就會涉及到js的垃圾回收機制。後面寫到的再細說,示例代碼如下:
function myfun(){
var message='hello';
//message=hello'; 合法,但不推薦,這樣可以再局部作用域中定義全局變數。不推薦的原因也是因為不好維護,畢竟想想就很奇怪
}
myfun();
console.log(message);//報錯
var聲明提升
⭐使用var聲明變數會把變數自動提升到函數作用域頂部。
function foo(){
console.log(name);
var name='Mercy';
}
foo();//undefined
之所以不會報錯,是因為ECMASCRIPT把他等價於如下代碼:
function foo(){
var name;
console.log(name);
name='Mercy';
}
foo();//undefined
let關鍵字
let作用域
⭐let跟var的作用差不多,但是有著非常重要的區別。最明顯的區別就是,let聲明的範圍是塊作用域,而var聲明的範圍是函數作用域。啥是塊作用域通俗點講就是 花括弧 { } 包裹的代碼塊。
if(true){
var name='Mercy';
cosnole.log(name);//Mercy
}
cosnole.log(name);//Mercy
if(true){
let name='Mercy';
cosnole.log(name);//Mercy
}
cosnole.log(name);//ReferenceError:name 沒有定義
冗餘聲明
⭐let也不允許同一個塊作用域中出現冗餘聲明。
var name;
var name;
let age;
let age;//SyntaxError:標識符age已經聲明過了
暫時性死區
⭐let與var的另一個重要的區別就是let聲明的變數不會再作用域中被提升。
cosnole.log(age);
let age=22;//ReferenceError:age 沒有定義
在let聲明之前的執行瞬間被稱為“暫時性死區”,在此階段引用後面才聲明的變數都會拋出ReferenceError。
全局聲明
⭐與var關鍵字不同,使用let在全局作用域中聲明的變數不會成為為window對象的屬性(var聲明的變數則會)。
var name = 'Matt';
console.log(window.name); // 'Matt'
let age = 26;
console.log(window.age); // undefined
---持續更新中---