2012-04-13 27 views
5

爲什麼jslint抱怨在聲明的函數中使用this?在聲明的函數中使用'this'嚴格違反,沒有違反函數表達式

function navigate() { 
    var id = $(this).attr('id'); 
} 

給我:

#1 Strict violation. 
var id = $(this).attr('id'), // Line 18, Pos 20 

然而,JSLint的沒有給出有關投訴:

var navigate = function() { 
    var id = $(this).attr('id'); 
} 

我使用他們兩人以同樣的方式,他們都在瀏覽器中正常工作。

view.on('click', navigate); 

僅供參考,我周圍的警告得到了利用event.target代替,但我想知道的區別是什麼。

function navigate(event) { 
    var id = $(event.target).attr('id'); // no complaint 
} 
+0

當我運行它通過JSLint的我沒有對'this'我得到了一個得到一個錯誤「事件」未被使用的錯誤。 – 2012-04-13 00:33:05

+0

是的,我忘了刪除前兩個函數中的事件,我只是添加它來解決關於'this'的投訴。更新的問題,謝謝。 – 2012-04-13 00:38:25

回答

3

看一看這個鏈接: https://github.com/shichuan/javascript-patterns/blob/master/general-patterns/function-declarations.html

從這個很好的參考這裏: http://shichuan.github.com/javascript-patterns/

提供這些的原因,但我不知道他們是多麼有說服力:

  1. 使它更容易理解「作爲對象的功能」。
  2. 它強化了很好的分號習慣。
  3. 傳統上與功能和範圍相關的行李不多。

該頁面上的「命名函數表達式」的原因有點更具說服力,但仍然沒有壓倒性。

順便說一句,那些看似來自約翰Resig的(jQuery的名聲),爲鏈接的位置: http://ejohn.org/blog/javascript-as-a-first-language/

+0

John Resig的有趣文章,感謝您的鏈接。雖然沒有具體的東西,特別是關於'this'。此外,函數聲明方法也有一些好處:1.不需要複製函數的名稱(在範圍頂部的var中,再次定義時),並且2.您從不遇到調用的問題該函數已被定義,因爲它被自動提升到當前範圍的頂部。 – 2012-04-13 00:46:21

+0

#2是[完全]無意義的IMOHO。我有很好的分號習慣。它包括*在每行末尾不包括虛假分號*。 「正確的」解決方案,再次IMOHO,是*從不用'(或'['*]開始一行,因爲這會阻止前一行沒有分號的ASI(請參閱主題上的無數SO帖子) – 2012-04-13 00:48:10

+0

將此標記爲現在正確...但仍然發現它很模糊。 – 2012-05-05 18:49:08