2012-04-13 25 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