2016-08-22 54 views
1

自從發佈以來,它允許我遵循更嚴格的命名約定。但是,讓我們考慮下面的場景,這樣做有效還是哈克做這樣的事情?我很清楚第一個函數的作用域和另一個塊的作用域。使用var並讓相同名稱的變量?

var sample = 'sample'; 

function fooBar() { 
    let sample = 'This is a sample'; 

    console.log(sample); 
} 

fooBar(); 

console.log(sample) 
+0

當然它是有效的,就好像都與'var'聲明。隱藏全局是個好主意嗎?幾乎肯定不是。在這種情況下它們都具有功能範圍。 –

+2

這不是一件怪事,它毫無意義。 1:不要使用全局狀態。 2:使用有意義的名字。 3:**從不**再次使用'var'。 – Amit

+0

@Amit - 我很好奇#3。謹慎闡述? – enhzflep

回答

1

你正在嘗試做的,是完全合法的,並被稱爲陰影。顧名思義 - 您已隱藏全局範圍變量樣本與功能範圍變量樣本。通過這樣做,你已經限制自己訪問全局變量而不使用某些特殊技巧。 您仍然可以訪問同名的全局變量的函數內部下方

var sample = 'sample'; 
function fooBar() { 
    var sample = 'This is a sample'; 
    console.log(sample); // 'This is a sample' 
    console.log(window.sample); //Sample 
    //console.log(this.sample);//Sample. Works only in non strict mode 
} 
fooBar(); 
console.log(sample); // 'sample' 

而且所給出的,如果有人說從不使用VAR那麼一點兒也不難一份聲明中做出。 var仍然有它的用處。您可以通過凱爾·辛普森看看這篇文章在這裏

https://davidwalsh.name/for-and-against-let

希望這是一些幫助。

快樂學習:) Vatsal

+0

嘿Vatsal。在父函數中訪問變量呢?我其實不嵌套功能,但我只是好奇。如果它不是窗口的一部分,而是另一個函數/對象,我會像這樣調用它:fn.sample? – Asperger

+0

您可以訪問當前函數作用域中或全局窗口作用域中的變量。你無法訪問父函數的變量。範圍查找總是從最內層的函數開始,一找到變量就停下來。您只能使用窗口對象訪問全局變量,但沒有辦法查找/訪問非全局陰影變量 – Vatsal

+0

我讀過David Walsh發表的博文,完全不滿意其中提供的參數。 –

1

這是有效的。

而且因爲一個聲明的功能之外,另一種是內,你甚至可以用var同時聲明:

var sample = 'sample'; 
 
function fooBar() { 
 
    var sample = 'This is a sample'; 
 
    console.log(sample); // 'This is a sample' 
 
} 
 
fooBar(); 
 
console.log(sample); // 'sample'

相關問題