2015-06-29 69 views
3

讓不工作我在函數聲明的變量的兩倍,而我使用「使用嚴格」。我知道這個函數具有全局範圍和它的變量也被視爲與全球範圍內的窗口即window.car使用嚴格按預期在Javascript

但它不應該重新申報的速度和容量變量裏面是否有讓數據類型的語句。 (「讓」聲明塊範圍局部變量,選擇將其初始化爲一個值。)

(function car() { 
    "use strict"; 
    var speed = 100; 
    const capacity = '1000CC'; 

    if(speed) { 
     let speed = 200; 
     let capacity = '5000CC'; 
     console.log(speed,capacity); 

    } 
    console.log(speed,capacity); 

})(); 

請讓我知道我在這裏失蹤。

+0

那麼有什麼問題,我從日誌中獲得'200「5000CC」',如預期的那樣? – adeneo

+0

我認爲應該有一個錯誤。和「你不能重新申報的速度和容量的if語句,」因爲我使用「使用嚴格的」不能跨越不同範圍 –

+0

@JahanzaibAslam既是''let'是const'作用域塊你 – CodingIntrigue

回答

3

「let」的聲明一個塊範圍局部變量。但是仍然可以在局部範圍內修改全局變量。

(function car() { 
    "use strict"; 
    var speed = 100; 
    const capacity = '1000CC'; 

    if(speed) { 
     let speed = 200; 
     let capacity = '5000CC'; 
     console.log(speed,capacity);//inside local it is modified to 200 

    } 
    console.log(speed,capacity);//outside scope it pull from global scope to 100 

})(); 

即使在嚴格模式下,您也可以重新聲明/修改全局變量。


只有當您在同一範圍內重新聲明相同的變量時,纔會出錯。看看下面的例子:MDN

if (x) { 
    let foo; 
    let foo; // TypeError thrown. 
} 

但是,函數體沒有這個限制! (但它在ES6拋出一個錯誤,雖然通過@Bergi的評論,可能是有錯誤的文檔中MDN)

function do_something() { 
    let foo; 
    let foo; // This works fine. 
} 
+0

但是,我可以重新聲明同樣的全局變量,讓數據類型在使用「嚴格使用」的塊語句內? –

+0

是的,你可以重新聲明。 –

+0

我認爲應該有一個錯誤。 「你不能在聲明中重新聲明速度和容量變量」,因爲我使用的是「使用嚴格」模式。你怎麼看? –

0

var聲明的變量speedlet宣佈speed兩個不同的變量

if語句體內部的speed在外部塊中聲明的變量的局部聲明 - 它不會重新聲明它。