先看乙個**:
console.info( x ); // undefined。因為在後面用 var 定義了變數。
var x = 100;
console.info(x); // 100
以上**相當於:
var x ; // var 定義的變數被提公升到前面來定義。這個現場就是 「變數提公升」。
console.info( x ); // undefined。因為在後面用 var 定義了變數。
x = 100;
console.info(x); // 100
但是,如果直接使用乙個變數,會報錯。
console.info( y ); // 報錯。沒有定義變數 y,莫名其妙冒出來了乙個變數。
let 定義的變數,必須先定義才使用,否則會報錯。
console.info( x ); // 報錯
let x = 100;
console.info(x);
console.info(i); // 100。在{}外可以訪問 var 定義的變數。
這是因為在es6之前,我們都是用var來宣告變數,而且js只有函式作用域和全域性作用域,沒有塊級作用域,所以{}
限定不了var宣告變數的訪問範圍。
es6新增的let
,可以在 {} 內定義區域性變數。
內有效!!!
}console.info(i); // 報錯
for (let i = 0; i < 10; i++)
console.info(i);
// referenceerror: i is not defined
for (var i = 0; i < 10; i++)
console.info(i);
// 10 。 在 for 迴圈外,可以訪問迴圈變數 i
let a = 0;
let a = 'sss';
// uncaught syntaxerror: identifier 'a' has already been declared
var x = 100;
var x = 200 ;
console.info(x ); // 200
綜上,let 顯然更加的嚴謹,讓我們寫的**更安全。所以,我們推薦使用 let 定義變數。 let 和 var 引起的閉包面試題
首先閉包的形成的條件 1.有兩個函式 2.兩個函式是巢狀關係 3.內部的函式呼叫了內部函式的變數 其次變數的查詢規則 沿著作用域鏈逐層往外面查詢,直到找到全域性的,屬性找不到為undefind,變數為err 最重要的一句話 js函式在執行的時候在他們被定義的作用域中,而不是被執行的作 下面進入正題,...
let 和 var 的區別
1 作用域只侷限於當前 塊 if true console.log str console.log str1 str1 is not defined2 let宣告的作用於不會被提公升 console.log str var str 1 console.log str1 str1 is not def...
var和let的區別
在es6中新增了let命令,用來宣告變數。它的用法類似於var,但是所宣告的變數,只在let命令所在的 塊內有效。let let所在的區域會形成塊級作用域 let不存在變數提公升的情況 let會形成暫時性的死區 不可以在同一作用域下重複宣告變數 var 在es6之前 都是用var 宣告變數,只有函式...