let與var的區別(重點看例子)

2021-08-21 23:40:17 字數 3101 閱讀 9771

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...