2014-02-15 31 views
1

學習JS在這裏,我對這個代碼運行的JSLint:在使用它們之前,我是否應該在JavaScript中真正聲明所有變量?

/*jslint devel: true*/ 

function Animal(n) { 
    "use strict"; 
    this.name = n; 
    this.prop = "a"; 
} 

var a = new Animal("duppa"); 

for (v in a) { 
    if (a.hasOwnProperty(v)) { 
     console.log("property:" + v); 
    } 
} 

我得到:

jslint:test2.js:11:6:'v' was used before it was defined. 
jslint:test2.js:11:8:Cannot read property "kind" from undefined 

jslint: ignored 0 errors. 

顯然,它抱怨說,我沒有宣佈v前面:

/*jslint devel: true*/ 

function Animal(n) { 
    "use strict"; 
    this.name = n; 
    this.prop = "a"; 
} 

var a = new Animal("duppa"); 

var v; 
for (v in a) { 
    if (a.hasOwnProperty(v)) { 
     console.log("property:" + v); 
    } 
} 

這關閉JSLint,但它真的有必要嗎?總的來說,我試圖遵循良好的習慣,但是這對JS來說是非常必要的嗎?例如。 Python沒有這些東西(for x in range(10)...等)幸福地生活。

+1

可能的重複[何時使用var in Javascript](http://stackoverflow.com/questions/5398766/when-to-use-var-in-javascript) –

+2

Python不是JavaScript,所以是的,這是必要的。你也可以爲'(var v in a){...}' – 0x499602D2

+0

@ 0x499602D2:這就是我最初做的,然後JSLint抱怨'jslint:test2.js:11:6:將'var'聲明移動到函數的頂部。 jslint:test2.js:11:6:無法讀取屬性「行」從未定義的' – LetMeSOThat4U

回答

1

是的,你絕對應聲明變量。否則,你會在全局範圍聲明v,這從來都不是好事,但對於計算長度爲v的單個字母的變量尤其不利。

考慮這樣兩個人變懶有關聲明的同名變量的情況:

// Your code, which iterates over a nested array 

var arr = [ [1, 2], [3, 4] ]; 

for (i = 0; i < arr.length; ++i) { 
    AwesomeLibrary.doSomething(arr[i]); 
} 

// way down elsewhere, in awesome_library.js... 

function doSomething(arr) { 
    for (i = 0; i < arr.length; ++i) { 
    // Now your `i` is clobbered, and we have a subtle but devastating bug 
    } 
} 

這還不需要兩個懶惰的人:如果你使用JavaScript足夠長的時間工作,並拒絕申報的變量,你最終會對你自己做這件事。

+0

Yikes!這個隱式的全局作用域var創建很糟糕!在Python中,你必須在函數中明確聲明你的變量爲'global',否則你正在創建局部變量。:-( Zen知道它說了什麼: 「明確比隱含更好」。 – LetMeSOThat4U

0

在使用它們之前定義變量總是一個更好的做法。這裏的JavaScript的for循環需要你定義我,因爲它是在for循環,使用

var v; 
for(v in a) 
+1

從不在循環中聲明變量,也會失敗jslint。 –

+0

@JoeMinichino它爲什麼失敗? – 0x499602D2

+0

感謝您的信息,不知道很多關於jslint只是js,將編輯 – CodeBird

0

記住的JSLint不會因爲一些晦澀的學術理由抱怨,而是因爲它可以保護你免受重大問題的應用程序可能可能遭受。

您聲明瞭一個變量來包含當前範圍中的變量。這對於你和你的程序來說是一個保障,並且使它更易於讀取代碼(全局變量總是混亂)。

想象一下,如果在應用程序中有一個全局變量v,然後在函數中使用相同的命名法(v)進行迭代。 Javascript會自動假定全局變量正在被使用,你會發現自己在全局中有不需要的值。話雖如此,你放在全局命名空間中的東西越少越好。

0

據我的理解,如果你使用一個變量而不在函數範圍內聲明它,它會在全局範圍內聲明,這不是最佳實踐。你很快就會用變量來覆蓋你的全局範圍。

//This creates a global variable 
function not_a_best_practice(){ 
    a=10; 
} 

//This creates a local variable 
function not_bad(){ 
    var a=20; 
} 

這個答案可以在手扔在討論更多的光線: What is the scope of variables in JavaScript?

1

有10種類型的人在世界上。那些理解你爲什麼在javascript和那些經常性行爲中聲明變量的人。 (只是微笑

你必須明白,每個函數都有自己的範圍,你必須使用這個範圍。如果你不在你的函數中使用聲明,那麼你改變了全局狀態,當然它影響很多事情。因此使用var並且不要創建全局變量!!!

相關問題