2017-10-14 81 views
3

考慮以下兩個功能:在javascript中聲明函數時,我必須使用`var`嗎?

cat = function() { 
    console.log("Meow"); 
} 

和:

var dog = function() { 
    console.log("woof") 
} 

cat() - > 「喵」

dog() - >「汪

他們都工作,除了貓沒有聲明使用var。這是否意味着它是全球範圍的?我會說t這兩個函數都是全局範圍的。也有語法function cat(){...},我想這是類似的第一種風格,某種隱式變量綁定...

有人可以解釋風格之間的區別聲明功能,如果有的話。

+3

不使用var/let/const使它*隱式爲全局*,這通常被認爲是一件壞事。如果你使用'嚴格使用',你會得到一個錯誤。總是最好明確地聲明,即使是全球性的。 – Nick

+3

[var關鍵字的用途是什麼以及何時使用它(或忽略它)?](https://stackoverflow.com/questions/1470488/what-is-the-purpose-of-the- var-keyword-and-when-use-it-or-omit-it) – Gerardo

+0

我看了一下Gerado的鏈接,看看snapjs寫了什麼,我覺得這幾乎清除了它。謝謝! – Ryan

回答

2

變量

  • 如果不指定varletconst它會被全局範圍
  • 如果指定varletconst那麼它將得到作用域取決於特定的符

var最近的封閉範圍 - 將得到範圍限定爲最近的封閉功能或)如果沒有內部定義的函數的全局範圍

let & const - 將得到作用域到最近的封閉塊)

功能

分配的功能如下:

var dog = function() { 
    console.log("woof") 
} 

意味着直到執行期間達到它在聲明的行功能將無法訪問,也就是你將只能從聲明它的行之後執行此函數。

而聲明一個函數如下:

function cat(){...} 

意味着它將被移動到封閉範圍的頂部,這樣你就能夠即使它早些時候到達範圍內的任意位置調用它在代碼中,而不是您聲明的行。

+0

謝謝大家回答。我接受了萊納斯的回答,因爲它使得這件事情變得清晰起來。從未真正理解這一點。這是一個很好的答案。 – Ryan

2

不使用var/let/const使其隱含地全局爲,這通常被認爲是不好的事情。如果你使用'use strict',你會得到任何隱式全局變量的錯誤。隱式全局變量帶來的最大問題是您可能不知道自己已經創建了全局變量。例如:

(function() { 
    a = 5; 
})(); 

// a doesn't exist right? 
console.log(a); // 5... whoops! 
+1

這不是一個函數聲明,它是一個函數表達式。你應該聲明* a *。 ;-) – RobG

2

不,你不知道。你可以聲明函數像這樣:

function foo(){ 
} 

然後foo在適當的範圍內自動聲明。 其全部關於範圍。口譯員將在何處宣佈該功能。這樣做,沒有var將導致解釋器自動創建一個全局變量,這是可能的最高範圍,這意味着它可以在代碼中的任何地方訪問。這被認爲是一件壞事,因爲除非有意完成,否則你通常不會那樣做,因爲如果你願意,我可以深入理解。

function foo(){ 
 
    function bar(){ 
 
    console.log("bar"); 
 
    } 
 
    
 
    bar(); 
 
    
 
    console.log(typeof bar); 
 
} 
 

 
foo(); 
 
bar(); // will throw an error since "bar" does not exist at this scope


閱讀所有關於function declaration