2016-04-26 72 views
2

我有一個局部範圍的問題。第二個console.log不顯示「a」值,但顯示未定義。爲什麼這樣?爲什麼本地作用域不引用全局變量?

"use strict" 

console.log(a); //undefined 
var a = "a"; 
function b(){ 
    console.log(a); // why is undefined here? 
    var a = "a1"; 
    console.log(a); // here is "a1" 
} 
b(); 
+0

刪除第二個'var'到_assign_一個值到全局'var a'而不是_redeclare_它。 –

+0

var a函數內部也是一個全球範圍..爲什麼你聲明兩個.. – nisar

+0

如果你的兄弟和朋友都被命名爲「鮑勃」,你需要更具體的與兩個車程。 – dandavis

回答

1

面向對象的JavaScript,第2版:當你的JavaScript程序執行進入一個新的功能,所有的變量聲明 在函數的任何位置被移動(或升高,或懸掛)的 函數的頂部。記住這是一個重要的概念。 此外,只有聲明被提升,這意味着只有 變量的存在被移動到頂端。任何任務都保持在原來的位置。 在前面的例子中,局部變量a的聲明是 。

var a = 123; 

function f() { 

    var a; // same as: var a = undefined; 

    alert(a); // undefined 

    a = 1; 

    alert(a); // 1 
} 
3

JS會處理你的代碼,如:

"use strict" 

var a; // undefined 
console.log(a); //undefined 

a = "a"; 

function b(){ 
    var a; // undefined 

    console.log(a); // all is clear, LOCAL variable a is undefined. 

    a = "a1"; 
    console.log(a); // here is "a1" 
} 

b(); 

閱讀更多關於吊裝here

此外,您還可以閱讀Function declaration hoisting,這也是JavaScript基礎知識的重要組成部分。

0

提升是JavaScript將默認行爲移至頂部的默認行爲。你的函數範圍內有一個a變量。這是它的外觀,當你執行它,如:

"use strict" 

console.log(a); //undefined 
var a = "a"; 
function b(){ 
    var a; 
    console.log(a); // Undefined because a is not set 
    a = "a1"; 
    console.log(a); // here is "a1" 
} 
b(); 
0

因爲你在函數B定義的另一個變量,所以它是這樣的:

function b() { 
    var a; 
    console.log(a); 
    a = "a1"; 
    console.log(a); 
} 
相關問題