var存在變數提公升,而let不存在變數提公升,所以用let定義的變數一定要在宣告後再使用,否則會報錯。
//var定義的變數存在變數提公升,變數會把宣告提公升到整個作用域的最前面
//例子1
console.log(a); //undefined
var c=10;
//等價於
var c;
console.log(a); //undefined
c=10;
/*------------------------*/
//例子2
var a=100;
function func()
func(); //呼叫函式
//等價於
var a=100;
function func()
func(); //呼叫函式
//注意:
//對於不宣告而直接賦值的變數,相當於全域性變數,賦值之後才可以使用,賦值之前會報錯
console.log(a); //報錯:a is not defined
a=100;
console.log(a); //100
//let定義的變數不存在變數宣告,變數在宣告前使用會報錯
//例子1
console.log(a); //報錯 a is not defined
let a=100;
//例子2
function func()
func();//呼叫函式
var:只有全域性作用域和函式作用域概念,沒有塊級作用域的概念。
let:只有塊級作用域的概念 ,由 包括起來,if語句和for語句裡面的也屬於塊級作用域。
//全域性作用域例子
//也就是除了在函式內部定義的變數,其他都是全域性變數。
for(var i=0;i<100;i++)
console.log(i); // 100
//函式作用域例子,如下 b會輸出10 ,而a會報錯「a is not defined」,為什麼呢?
//因為對於不宣告而直接賦值的變數(b),相當於全域性變數。
//而對於在函式裡宣告賦值的變數(a),它只在函式內部有效,外部無法訪問,否則會報錯
function func()
func();//呼叫函式
console.log(b); // 10
console.log(a); //報錯 a is not defined
/*補知識
函式的語法:自呼叫函式,也就是會定義並呼叫該函式(iife)
(function())();
*///考一考
(function())();
console.log(b);
console.log(a);
//問題:a和b分別會輸出什麼呢?
//答案:b會輸出100,而a會報錯「a is not defined」
//為什麼呢?
//首先,將該函式分解為我們所熟悉的寫法
(function())();
console.log(b); // 100
console.log(a); // 報錯 a is not defined;
//由此,可以看出了吧?這是前面所說的「函式的作用域」:b相當於全域性變數,而a只作用於該函式內,外部訪問不了。
只要塊級作用域內存在let命令,它所宣告的變數就「繫結」(binding)這個區域,不再受外部的影響。在**塊中,使用let命令宣告變數之前,該變數都是不可用的,這在語法上稱為「暫時性死亡」
//例子1
//會報錯「a is not defined」,因為在if**塊內,使用let宣告變數之前,該變數都是不可用的,否則會報錯
if(true)
//例子2
//會報錯「i is not defined」,因為用let定義的i只在for迴圈體內有效
for(let i=1;i<100;i++)
console.log(i)
var:變數可以多次宣告
let:變數不允許重複宣告,let不允許在相同作用域內,重複宣告同乙個變數。不能在函式內部,重新宣告同乙個引數
var a=10;
function func()
func();
console.log(a); // 10
var a;
console.log(a); // 10
var a =12;
console.log(a); // 12
//這個其實涉及到的是var的變數可重複宣告和變數提公升
//以上其實可以等價於
var a;
a=10;
function func()
func();
console.log(a); // 10
console.log(a); // 10
a =12;
console.log(a); // 12
//這樣,相信很容易得出正確的答案
//例子1
//會報錯「identifier 'a' has already been declared」
var a=1;
let a=2;
//例子2
//不會報錯,因為a可以在不同作用域內宣告的。
let a='hello';
console.log(a); // hello
//例子3
//會報錯" identifier 'a' has already been declared",因為var定義的變數會發生變數提公升。
let a='hello';
console.log(a);
//例子4
//會報錯「identifier 'a' has already been declared」,
//不能在函式內部重複宣告同乙個引數,因為引數變數是預設宣告的,所以不能用let或const再次宣告
function func(a)
func('hi');
var 與 let 的區別
var與let的區別是作用域不同,var作用域在最近的函式區塊內,let作用域在最近的封閉區塊內,比函式區塊要小。如果沒有在區塊內的話,二者都是全域性的。全域性的 在函式區塊之外使用的話,二者是等價的,都是全域性的。let me go globally scoped vari able global...
let與var的區別
let為es6新增的用來宣告變數的命令,用法類似與var,那麼let和var具體是怎麼個用法以及他們之間有什麼區別呢?一.let宣告的變數只在let 塊有效 console.log a 報錯,a is not defined console.log b 2複製 用let宣告了變數a,用var宣告了變...
let 與 var 的區別
let 與 var 的區別 a.let 不能重複宣告,但var可以 b.let會產生塊級作用域,且只在自己的作用域內生效,但var不受限制 c.變數提公升 console.log i undefined var i 10 console.log i 10 console.log i 報錯 let i...