2013-04-14 224 views
1

我正在嘗試一些簡單的JS代碼。我意識到我們應該使用var關鍵字來聲明循環內的循環變量,例如for循環以避免全局變量聲明。但是我意識到,循環變量循環的執行過之後存在:JS循環變量範圍

var a = [1, 2, 3, 4, 5, 6]; 
for (var i = 0; i < a.length; i++) 
    document.write(a[i]); //123456 
document.write(i); //6 

這不是內聯(其實它並不需要是的,我知道),在對象for循環的循環變量如何面向概念表現。我知道我不應該在任何方面比較JavaScript和OO語言。不過,我只是猜測OO語言中的行爲更好。

我認爲,如果我們把這個代碼直接放在<script>標記中,那麼它實際上會將循環變量添加到不需要的全局範圍中。是這樣嗎?或者我在想錯誤的方式?

我們可以通過建立明確的功能範圍實現這樣的行爲:

var a1 = [1, 2, 3, 4, 5, 6]; 
(function() { 
    for (var i1 = 0; i1 < a.length; i1++) 
     document.write(a[i1]); //123456 
})(); 

document.write(i1); //undefined 

但是,它的標準方式/遵循生產?還有什麼其他的事情可以做?

+0

for循環(及其範圍行爲)與OOP有什麼關係? – Bergi

+0

@Bergi umm我認爲當我們寫'for(int i = 0; i Mahesha999

+0

JavaScript(和許多其他語言)沒有塊範圍。這與語言是否遵循一些OOP原則無關。 – Bergi

回答

2

我們可以通過創建顯式函數範圍來實現這樣的行爲。但它是生產中的標準方式嗎?

是的。函數是在JavaScript中引入新範圍的唯一可能性(儘管在將來的版本中可能會更改爲let);和IIFEs也大量用於生產。

還有什麼其他的事情可以做?

要將i的範圍限制爲for-loop的塊?沒有(更不用說let)。但是,您幾乎不需要這麼做,因爲沒有任何東西會干擾它 - var i仍然是您的函數的本地範圍。有時候,你甚至可能想在循環之後使用i作爲正在進行的計數器。

+0

但這是否意味着每個'for'需要嵌套在函數範圍內? – Mahesha999

+0

不需要。只有當你需要'i'才能在循環中顯式地確定範圍,但情況並非如此。 – Bergi

+1

修辭?可能是肯定的,我試圖把它整齊地排列起來,但不僅僅是爲了引起巨大的反應和點擊。否則,每一個好問題都將成爲一種言辭。我通常會在初次閱讀之後,通過網絡閱讀有關我閱讀的舊主題的相關重要內容。所以只是想檢查我是否錯過了任何東西。像JS這樣的語言非常有可能非常靈活,並且具有專門針對模式的單獨書籍。問題的答案可以是否定的,沒有其他已知的方式或模式來解決這個問題,但這仍然會增加我的理解的一些價值。 – Mahesha999

0

JavaScript只有function scope任何在副函數中使用var定義的變量僅在函數內部可用。 for循環不會爲變量創建任何範圍。

+0

是的,我知道,但許多模式,實踐演變爲利用JS中的OOP優勢,或者甚至讓JS像OO語言一樣行事。只是想知道是否有任何標準/遵循的解決方法/模式來將循環變量作用於循環塊。 – Mahesha999

0

Javascript是有點奇怪,並有,恕我直言,很多缺陷,使它成爲中/大項目糟糕的語言。

「var」表示該變量僅在當前函數範圍內可用: 所有變量都在函數運行並設置爲「undefined」之前在begening中定義。 所以:

alert(i); 
var i=4; 
alert(i); 
var i=5; 
alert(i); 

內部的意思:

var i=undefined; 
alert(i); 
i=4; 
alert(i); 
i=5; 
alert(i); 

在結構化程序設計,所有的代碼應該是功能,使意味着按照預期的「變種」的關鍵字會工作。但是,如果你在全局範圍內編寫代碼,「var」沒有任何意義。