let 和 const var
阿新 • • 發佈:2021-06-10
var:
當在函式內部沒有定義這個變成,預設就是在全域性的上下文定義了一個var sum;
function add(num1, num2) { sum = num1 + num2; // var sum = num1 + num2 這個樣的結果就是報錯sum is not defined return sum; } let result = add(10, 20); // 30 console.log(sum); //30
變數提升
console.log(name); // undefined var name = 'Jake';
函式提升變數,可以把
function getName(){return 4};//函式宣告
看錯是宣告加賦值的功能,函式表示式就只是一個宣告賦值還是需要根據全域性的上下文來執行的。
var getName = function(){return 2};//函式表示式 function getName(){return 4};//函式宣告 console.log(getName());//2 console.log(getName());//4 var getName = function(){return 2};//函式表示式 console.log(getName());//2 function getName(){return 4};//函式宣告
let:
就是塊級作用域
const:
它和let的區別就是,首先當定義const的時候需要提前賦值,不能更改引用名和數值
const o1 = {}; o1 = {}; // TypeError: 給常量賦值 const o2 = {}; o2.name = 'Jake'; console.log(o2.name); // 'Jake'如果想讓整個物件都不能修改,可以使用 Object.freeze(),這樣再給屬性賦值時雖然不會報錯, 但會靜默失敗:
const o3 = Object.freeze({}); o3.name = 'Jake'; console.log(o3.name); // undefined
總結:
由於 const 聲明暗示變數的值是單一型別且不可修改,JavaScript 執行時編譯器可以將其所有例項 都替換成實際的值,而不會通過查詢表進行變數查詢。谷歌的 V8 引擎就執行這種優化。 這個例項就是前面o2.name這些當使用到了const這個引用名就是直接變成實際的值。開發中儘量的使用const。